处理PyQt4中场景/视图操作的事件

时间:2013-07-04 09:39:27

标签: pyqt pyqt4

我正在试图找出在QT场景/视图框架中执行更新的“最佳”或推荐方式。我已经包含了一个说明问题的小例子。

代码使用三个按钮创建一个全屏对话框。单击每个按钮,会向对话框添加一个带有场景的QGraphicsView窗口小部件,并向场景中引入两个矩形。目标是使场景的内容适合视图窗口小部件。每个按钮都尝试以不同的方式执行拟合:

天真:添加视图/场景,添加矩形并调用fit方法。这实际上并没有最终完成所需的操作(即,场景内容未正确适合视图小部件)。

processEvents :在添加内容和调用fit方法之间调用QT processEvents以确保更新所有内容。产生想要的结果。

singleShot :在一段延迟(t1t2)之后,通过QTimer.singleShot调用content和fit方法。如果延迟“足够大”,则可以正常工作

因此,一种方法(processEvents)始终有效,但我已经读过,这是实现目标的一种蛮力方式,不推荐使用。 singleShot方法有效,并且具有减慢速度的缺点(如果可以在50ms内完成,我不想等待200ms以使内容适合)。

除了这两种方法之外,还有其他方法可以获得理想的结果吗?

from PyQt4 import QtGui as QG
from PyQt4 import QtCore as QC
import sys


class MainUI(QG.QDialog):
    def __init__(self, parent=None):
        super(MainUI, self).__init__(parent)
        layout = QG.QVBoxLayout()
        self.setLayout(layout)
        button_layout = QG.QHBoxLayout()
        pb3 = QG.QPushButton('singleShot')
        pb2 = QG.QPushButton('processEvents')
        pb1 = QG.QPushButton('naive')
        button_layout.addWidget(pb1)
        button_layout.addWidget(pb2)
        button_layout.addWidget(pb3)
        layout.addLayout(button_layout)
        pb3.clicked.connect(self.scene_maker_singleshot)
        pb2.clicked.connect(self.scene_maker_processevents)
        pb1.clicked.connect(self.scene_maker_naive)

    def scene_maker_processevents(self):
        self.make_scene()
        QG.QApplication.processEvents()
        self.view.fitInView(self.view.sceneRect())

    def scene_maker_singleshot(self):
        t1 = 100
        t2 = 200
        QC.QTimer.singleShot(t1, self.make_scene)
        QC.QTimer.singleShot(t2, lambda: self.view.fitInView(self.view.sceneRect()))

    def scene_maker_naive(self):
        self.make_scene()
        self.view.fitInView(self.view.sceneRect())


    def make_scene(self):
        layout = self.layout()
        scene = QG.QGraphicsScene()
        view = QG.QGraphicsView()
        view.setScene(scene)
        layout.addWidget(view)
        self.view = view
        scene.addRect(1,1,10,5,brush = QG.QBrush(QG.QColor('red')))
        scene.addRect(11,21,15,5, brush = QG.QBrush(QG.QColor('blue')))

if __name__=="__main__":
    app = QG.QApplication(sys.argv)
    screen_size = app.desktop().screenGeometry()
    gui = MainUI()
    gui.show()
    gui.showMaximized()
    app.exec_()

0 个答案:

没有答案