1

QTシーン/ビューフレームワークで更新を実行する「最良の」または推奨される方法は何かを理解しようとしています。問題を示す小さな例を含めました。

このコードは、3 つのボタンを持つフルスクリーン ダイアログを作成します。各ボタンをクリックするQGraphicsViewと、シーンを含むウィジェットがダイアログに追加され、2 つの長方形がシーンに導入されます。目標は、シーンのコンテンツがビュー ウィジェットに収まるようにすることです。各ボタンは、さまざまな方法でフィットを実行しようとします。

naive : ビュー/シーンを追加し、長方形を追加して、fit メソッドを呼び出します。これは、実際に必要なことを実行することにはなりません (つまり、シーンのコンテンツがビュー ウィジェットに適切に適合していません)。

processEvents : コンテンツの追加と fit メソッドの呼び出しの間に QTprocessEventsが呼び出され、すべてが確実に更新されます。必要な結果を生成します。

singleShot : content メソッドと fit メソッドは、特定の遅延 (t1およびt2) の後に QTimer.singleShot を介して呼び出されます。遅延が「十分に大きい」場合に機能します

したがって、1 つの方法 ( processEvents) は常に機能しますが、これは目標を達成するための強引な方法であり、推奨されないことを読みました。メソッドのsingleShot種類は機能し、速度が低下するという欠点があります(50ミリ秒で実行できる場合、コンテンツが収まるまで200ミリ秒待ちたくありません)。

これら2つ以外に、望ましい結果を得る方法はありますか?

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_()
4

0 に答える 0