为什么中央小部件 (QWidget) 在从另一个文件导入时无法正确调整大小?
Why the central widget(QWidget) doesn't get sized properly when its imported from another file?
当我试图将代码拆分到另一个文件中以便更易于管理时,发生了不良行为。
从另一个文件导入时,我的 Qwidget 在屏幕上变小了。
如果我们要从以下位置替换设置 CentralWidget 的行:
self.setCentralWidget(self.view)
至:
self.setCentralWidget(QTextEdit())
textedit 小部件将毫无问题地显示出来,而且是全尺寸的。
我正在处理的是 QgraphicsView 问题还是布局问题?
main.py
中代码的相关部分
import sys
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from viewport import ViewPort
class dockdemo(QMainWindow):
def __init__(self, parent=None):
super(dockdemo, self).__init__(parent)
self.view:QWidget = ViewPort()
bar = self.menuBar()
file = bar.addMenu("File")
file.addAction("New")
file.addAction("save")
file.addAction("quit")
# buttons layout
buttons = QWidget()
vert_layout = QVBoxLayout()
button = QPushButton("Rotate - ", self)
button.setGeometry(200, 450, 100, 50)
button.clicked.connect(self.view.rotate_minus)
button2 = QPushButton("Rotate + ", self)
button2.setGeometry(320, 450, 100, 50)
button2.clicked.connect(self.view.rotate_plus)
button3 = QPushButton("zoom-in ", self)
button3.clicked.connect(self.view.zoom_in)
button4 = QPushButton("zoom-out ", self)
button4.clicked.connect(self.view.zoom_out)
button5 = QPushButton("reset zoom ", self)
button5.clicked.connect(self.view.reset_zoom)
vert_layout.addWidget(button)
vert_layout.addWidget(button2)
vert_layout.addWidget(button3)
vert_layout.addWidget(button4)
vert_layout.addWidget(button5)
buttons.setLayout(vert_layout)
self.Mydock = QDockWidget("Dockable", self)
self.Mydock.setWidget(buttons)
self.Mydock.setFloating(False)
self.addDockWidget(Qt.LeftDockWidgetArea, self.Mydock)
self.setCentralWidget(self.view)
self.setWindowTitle("Dock demo")
我的 qwidget 在 viewport.py
import sys
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
class ViewPort(QWidget):
def __init__(self, parent=None):
super(ViewPort, self).__init__(parent)
self.scene = QGraphicsScene(self)
greenBrush = QBrush(Qt.green)
blueBrush = QBrush(Qt.blue)
blackPen = QPen(Qt.black)
blackPen.setWidth(5)
ellipse = self.scene.addEllipse(10, 10, 11, 11, blackPen, greenBrush)
ellipse.moveBy(100, 0)
rect = self.scene.addRect(-100, -100, 200, 200, blackPen, blueBrush)
self.scene.addText("Codeloop.org", QFont("Sanserif", 15))
ellipse.setFlag(QGraphicsItem.ItemIsMovable)
rect.setFlag(QGraphicsItem.ItemIsMovable)
self.view = QGraphicsView(self.scene, self)
setattr(self.view, 'scale_of_viewport', 0)
# filter event so mouse wheel wont scroll. see def event filter
self.view.viewport().installEventFilter(self)
结果:
预期结果(如果我从 main.py 实现 Qgraphicsview,就会发生这种情况):
所以因为我想在不同的文件 (viewport.py) 上实现视口,所以小部件不再像预期的那样接管屏幕。我尝试过 setGeometry()、setminimumsize() 和更改布局,但均未成功。我只想在 qwidgets 变得巨大之前在不同的文件中实现它们。我在网上找不到答案。
感谢您的帮助。
问题
如您所料,是布局问题。您的 ViewpPort
小部件没有有序的结构。这意味着 QGraphicsView
的大小(在 ViewPort
内)与 ViewPort
小部件的大小没有任何关系。当您尝试调整 dockdemo
内 ViewPort
的大小时,QGraphicsView
不会受到影响。
解决方案
只需在 ViewPort
小部件中添加一个布局,然后在其中添加 QGraphicsView
。这是您的 ViewPort
class 更改(更改已注释):
class ViewPort(QWidget):
def __init__(self, parent=None):
super(ViewPort, self).__init__(parent)
## Create a Layout and set it in the widget,
## in this case I created a Vertical Layout
central_layout = QVBoxLayout()
self.setLayout(central_layout)
## (end)
self.scene = QGraphicsScene(self)
greenBrush = QBrush(Qt.green)
blueBrush = QBrush(Qt.blue)
blackPen = QPen(Qt.black)
blackPen.setWidth(5)
ellipse = self.scene.addEllipse(10, 10, 11, 11, blackPen, greenBrush)
ellipse.moveBy(100, 0)
rect = self.scene.addRect(-100, -100, 200, 200, blackPen, blueBrush)
self.scene.addText("Codeloop.org", QFont("Sanserif", 15))
ellipse.setFlag(QGraphicsItem.ItemIsMovable)
rect.setFlag(QGraphicsItem.ItemIsMovable)
self.view = QGraphicsView(self.scene, self)
setattr(self.view, 'scale_of_viewport', 0)
self.view.viewport().installEventFilter(self)
## Add your QGraphicsView inside the layout
central_layout.addWidget(self.view)
## (end)
结果如下:
(我用的是PyQt5,但是我觉得这个在PySide2中可以正常工作,看看是否有效)
当我试图将代码拆分到另一个文件中以便更易于管理时,发生了不良行为。 从另一个文件导入时,我的 Qwidget 在屏幕上变小了。 如果我们要从以下位置替换设置 CentralWidget 的行:
self.setCentralWidget(self.view)
至:
self.setCentralWidget(QTextEdit())
textedit 小部件将毫无问题地显示出来,而且是全尺寸的。 我正在处理的是 QgraphicsView 问题还是布局问题?
main.py
中代码的相关部分import sys
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from viewport import ViewPort
class dockdemo(QMainWindow):
def __init__(self, parent=None):
super(dockdemo, self).__init__(parent)
self.view:QWidget = ViewPort()
bar = self.menuBar()
file = bar.addMenu("File")
file.addAction("New")
file.addAction("save")
file.addAction("quit")
# buttons layout
buttons = QWidget()
vert_layout = QVBoxLayout()
button = QPushButton("Rotate - ", self)
button.setGeometry(200, 450, 100, 50)
button.clicked.connect(self.view.rotate_minus)
button2 = QPushButton("Rotate + ", self)
button2.setGeometry(320, 450, 100, 50)
button2.clicked.connect(self.view.rotate_plus)
button3 = QPushButton("zoom-in ", self)
button3.clicked.connect(self.view.zoom_in)
button4 = QPushButton("zoom-out ", self)
button4.clicked.connect(self.view.zoom_out)
button5 = QPushButton("reset zoom ", self)
button5.clicked.connect(self.view.reset_zoom)
vert_layout.addWidget(button)
vert_layout.addWidget(button2)
vert_layout.addWidget(button3)
vert_layout.addWidget(button4)
vert_layout.addWidget(button5)
buttons.setLayout(vert_layout)
self.Mydock = QDockWidget("Dockable", self)
self.Mydock.setWidget(buttons)
self.Mydock.setFloating(False)
self.addDockWidget(Qt.LeftDockWidgetArea, self.Mydock)
self.setCentralWidget(self.view)
self.setWindowTitle("Dock demo")
我的 qwidget 在 viewport.py
import sys
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
class ViewPort(QWidget):
def __init__(self, parent=None):
super(ViewPort, self).__init__(parent)
self.scene = QGraphicsScene(self)
greenBrush = QBrush(Qt.green)
blueBrush = QBrush(Qt.blue)
blackPen = QPen(Qt.black)
blackPen.setWidth(5)
ellipse = self.scene.addEllipse(10, 10, 11, 11, blackPen, greenBrush)
ellipse.moveBy(100, 0)
rect = self.scene.addRect(-100, -100, 200, 200, blackPen, blueBrush)
self.scene.addText("Codeloop.org", QFont("Sanserif", 15))
ellipse.setFlag(QGraphicsItem.ItemIsMovable)
rect.setFlag(QGraphicsItem.ItemIsMovable)
self.view = QGraphicsView(self.scene, self)
setattr(self.view, 'scale_of_viewport', 0)
# filter event so mouse wheel wont scroll. see def event filter
self.view.viewport().installEventFilter(self)
结果:
预期结果(如果我从 main.py 实现 Qgraphicsview,就会发生这种情况):
所以因为我想在不同的文件 (viewport.py) 上实现视口,所以小部件不再像预期的那样接管屏幕。我尝试过 setGeometry()、setminimumsize() 和更改布局,但均未成功。我只想在 qwidgets 变得巨大之前在不同的文件中实现它们。我在网上找不到答案。 感谢您的帮助。
问题
如您所料,是布局问题。您的 ViewpPort
小部件没有有序的结构。这意味着 QGraphicsView
的大小(在 ViewPort
内)与 ViewPort
小部件的大小没有任何关系。当您尝试调整 dockdemo
内 ViewPort
的大小时,QGraphicsView
不会受到影响。
解决方案
只需在 ViewPort
小部件中添加一个布局,然后在其中添加 QGraphicsView
。这是您的 ViewPort
class 更改(更改已注释):
class ViewPort(QWidget):
def __init__(self, parent=None):
super(ViewPort, self).__init__(parent)
## Create a Layout and set it in the widget,
## in this case I created a Vertical Layout
central_layout = QVBoxLayout()
self.setLayout(central_layout)
## (end)
self.scene = QGraphicsScene(self)
greenBrush = QBrush(Qt.green)
blueBrush = QBrush(Qt.blue)
blackPen = QPen(Qt.black)
blackPen.setWidth(5)
ellipse = self.scene.addEllipse(10, 10, 11, 11, blackPen, greenBrush)
ellipse.moveBy(100, 0)
rect = self.scene.addRect(-100, -100, 200, 200, blackPen, blueBrush)
self.scene.addText("Codeloop.org", QFont("Sanserif", 15))
ellipse.setFlag(QGraphicsItem.ItemIsMovable)
rect.setFlag(QGraphicsItem.ItemIsMovable)
self.view = QGraphicsView(self.scene, self)
setattr(self.view, 'scale_of_viewport', 0)
self.view.viewport().installEventFilter(self)
## Add your QGraphicsView inside the layout
central_layout.addWidget(self.view)
## (end)
结果如下:
(我用的是PyQt5,但是我觉得这个在PySide2中可以正常工作,看看是否有效)