问题描述
当我试图将代码拆分到另一个文件中以使其更易于管理时,发生了不良行为。 从另一个文件导入时,我的 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,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")
我在 viewport.py 中的 qwidget
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,blackPen,greenBrush)
ellipse.moveBy(100,0)
rect = self.scene.addRect(-100,-100,200,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() 和更改布局,但都没有成功。我只是希望能够在它们变得巨大之前在不同的文件中实现 qwidget。我在网上找不到答案。 感谢您的帮助。
解决方法
问题
如您所料,布局有问题。您的 ViewpPort
小部件没有一个有组织的结构。这意味着 QGraphicsView
(在 ViewPort
内)的大小与 ViewPort
小部件的大小没有任何关系。当您尝试在 ViewPort
内调整 dockdemo
的大小时,QGraphicsView
不会受到影响。
解决方案
只需在您的 ViewPort
小部件中添加一个布局,然后在其中添加 QGraphicsView
。这是您更改的 ViewPort
类(已注释更改):
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,blackPen,greenBrush)
ellipse.moveBy(100,0)
rect = self.scene.addRect(-100,-100,200,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 中运行良好,请告诉它是否有效)