为什么中央小部件QWidget从另一个文件导入时没有正确调整大小?

问题描述

当我试图将代码拆分到另一个文件中以使其更易于管理时,发生了不良行为。 从另一个文件导入时,我的 Qwidget 在屏幕上变小。 如果我们要替换设置 CentralWidget 的行:

self.setCentralWidget(self.view)

到:

self.setCentralWidget(QTextEdit())

textedit 小部件将毫无问题地显示出来,完全大小。 这是我正在处理的 QgraphicsView 问题还是布局问题?

ma​​in.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)

结果:

result

预期结果(如果我从 main.py 实现 Qgraphicsview 会发生这种情况):

expected

所以,因为我想在不同的文件 (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)

结果如下:

enter image description here

(我使用 PyQt5,但我认为这在 PySide2 中运行良好,请告诉它是否有效)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...