我试图弄清楚在 QT 场景/视图框架中执行更新的“最佳”或推荐方式是什么。我已经包含了一个说明问题的小例子。
该代码创建了一个带有三个按钮的全屏对话框。单击每个按钮时,都会QGraphicsView
在对话框中添加一个带有场景的小部件,并在场景中引入两个矩形。目标是使场景的内容适合视图小部件。每个按钮都尝试以不同的方式执行拟合:
naive:添加视图/场景,添加矩形并调用 fit 方法。这实际上并没有最终完成所需的操作(即,场景内容未正确适合视图小部件)。
processEvents:在添加内容和调用 fit 方法之间,调用 QTprocessEvents
以确保所有内容都已更新。产生想要的结果。
singleShot: content 和 fit 方法在一定的延迟(t1
和t2
)后通过 QTimer.singleShot 调用。如果延迟“足够大”则有效
因此,一种方法 ( processEvents
) 始终有效,但我读到这是一种实现目标的蛮力方法,不推荐使用。该singleShot
方法有点工作并且具有减慢速度的缺点(如果可以在 50 毫秒内完成,我不想等待 200 毫秒以适应内容)。
除了这两种方法之外,还有其他方法可以得到想要的结果吗?
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_()