【问题标题】:QGraphicsView wrong size at startQGraphicsView在开始时尺寸错误
【发布时间】:2020-10-26 21:06:51
【问题描述】:

我有一个问题,我制作了一个 QGraphicsView,里面有 2 个矩形。我希望它们在我调整对话框大小时调整大小,所以我重写了一个对话框类。它可以工作,但一开始我的矩形尺寸错误

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QGraphicsScene, QGraphicsEllipseItem
import sys

# Redéfinition de dialog pour utiliser resize event

class MyDialog (QtWidgets.QDialog) :
    def resizeEvent(self, event):
        print("resize")
        #print(view.sceneRect())

        view.fitInView(scene.sceneRect(), QtCore.Qt.KeepAspectRatio) ######## I DONT KNOW WHY THIS LINE MAKE THE VIEW TOO SMALL AT START
        QtWidgets.QDialog.resizeEvent(self, event)
        #view.fitInView(rectangle)
        
class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(556, 580)
        self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
        self.verticalLayout.setObjectName("verticalLayout")
        self.graphicsView = QtWidgets.QGraphicsView(Dialog)
        self.graphicsView.setObjectName("graphicsView")
        self.verticalLayout.addWidget(self.graphicsView)

        global view
        view = self.graphicsView
        triangle = QtWidgets.QGraphicsRectItem(10,10,200,200)
        rectangle  = QtWidgets.QGraphicsRectItem(100,100,200,200)
        global scene
        scene = QtWidgets.QGraphicsScene()

        scene.addItem(rectangle)
        scene.addItem(triangle)
        self.graphicsView.setScene(scene)


        #self.graphicsView.fitInView(scene.sceneRect(), QtCore.Qt.KeepAspectRatio)
        #view.fitInView(scene.sceneRect(), QtCore.Qt.KeepAspectRatio)

        
        self.graphicsView_2 = QtWidgets.QGraphicsView(Dialog)
        self.graphicsView_2.setObjectName("graphicsView_2")
        self.verticalLayout.addWidget(self.graphicsView_2)
        self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
        self.buttonBox.setObjectName("buttonBox")
        self.verticalLayout.addWidget(self.buttonBox)

        self.retranslateUi(Dialog)
        self.buttonBox.accepted.connect(Dialog.accept)
        self.buttonBox.rejected.connect(Dialog.reject)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = MyDialog()
    ui = Ui_Dialog()
    
    ui.setupUi(Dialog)
    
    Dialog.show()
    sys.exit(app.exec_())

当我启动 QDialog 时,它看起来像这样

当我调整窗口大小时,我希望它看起来像

【问题讨论】:

    标签: python pyqt pyqt5 qgraphicsview


    【解决方案1】:

    注意:建议不要修改 Qt Designer 生成的代码,所以为了使我的回答正常工作,您必须使用 pyuic5 重新生成文件:pyuic5 your_file.ui -o gui.py -x

    这样 fitInView 方法使用了一些直到它使 QGraphicsView 可见才更新的属性,所以解决方案是验证它是否可见:

    ma​​in.py

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    from gui import Ui_Dialog
    
    
    class MyDialog(QtWidgets.QDialog, Ui_Dialog):
        def __init__(self, parent=None):
            super().__init__(parent)
            self.setupUi(self)
    
            triangle = QtWidgets.QGraphicsRectItem(10, 10, 200, 200)
            rectangle = QtWidgets.QGraphicsRectItem(100, 100, 200, 200)
            scene = QtWidgets.QGraphicsScene()
    
            scene.addItem(rectangle)
            scene.addItem(triangle)
            self.graphicsView.setScene(scene)
    
        def resizeEvent(self, event):
            if self.isVisible():
                self.graphicsView.fitInView(
                    self.graphicsView.scene().sceneRect(), QtCore.Qt.KeepAspectRatio
                )
            super().resizeEvent(event)
    
    
    if __name__ == "__main__":
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        w = MyDialog()
        w.show()
        sys.exit(app.exec_())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      • 2017-08-30
      • 1970-01-01
      相关资源
      最近更新 更多