如何解决为什么中央小部件QWidget从另一个文件导入时没有正确调整大小?
当我试图将代码拆分到另一个文件中以使其更易于管理时,发生了不良行为。 从另一个文件导入时,我的 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 中运行良好,请告诉它是否有效)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。