6

私は PyQt にアイテムのグリッドを持っています。ユーザーがウィンドウ サイズを変更すると、それに応じて列の数を増減する必要があります。行数はスクロールエリアによって処理されるため、y 方向の変更について心配する必要はありません (それが重要な場合)。

QMainWindow の実装内で、すべてのウィンドウ調整に対してトリガーされる resizeEvent() 関数をオーバーライドできることがわかっています。ただし、それを使用して毎回グリッドを再構築するのは、非常に非効率的です。関数がどのように機能するかをテストするためだけに、resizeEvent に単に文字列を出力させました。これにより、ウィンドウの調整が少し遅くなり、視覚的に不完全になりました (スムーズではなくジッター)。おそらく、ウィンドウ サイズに対して単純な除算操作を実行して、列数を変更するのに十分なほど大きくなったか小さくなったかを確認しますが、それでも調整ごとに 100 回実行すると、遅延の問題が発生する可能性があります。グリッド全体の再構築には 1 秒もかかる場合があるため、ユーザーがウィンドウを操作しているため再構築する必要がないことが望ましいでしょう。

それを行うためのより効率的な方法はありますか、それとも resizeEvent が私の唯一のオプションですか? 理想的には、ユーザーがウィンドウの調整を終了したときにのみトリガーされるイベントが必要であり、発生したほぼすべてのピクセルの動きに対してトリガーされるイベントではありません (1 秒間の調整ごとに数百または数千回になる可能性があります)。 .

私は PyQt5 を使用していますが、PyQt4 に精通している場合は、PyQt5 のコンテキストで PyQt4 ソリューションを理解できます。C++ Qt4/5 ソリューションでも同じです。

4

2 に答える 2

5

サイズ変更がいつ完了したかを検出することが唯一の本当の問題のようです。これが注意深く制御されている限り、実際のレイアウトは好きなように行うことができます。

以下は、タイマーを使用してサイズ変更完了シグナルが発行されるタイミングを制御するソリューションです。ラグがないように見えますが、複雑なレイアウトでテストしていません (問題ないはずです)。

from PyQt4 import QtCore, QtGui

class Window(QtGui.QWidget):
    resizeCompleted = QtCore.pyqtSignal()

    def __init__(self):
        QtGui.QWidget.__init__(self)
        self._resize_timer = None
        self.resizeCompleted.connect(self.handleResizeCompleted)

    def updateResizeTimer(self, interval=None):
        if self._resize_timer is not None:
            self.killTimer(self._resize_timer)
        if interval is not None:
            self._resize_timer = self.startTimer(interval)
        else:
            self._resize_timer = None

    def resizeEvent(self, event):
        self.updateResizeTimer(300)

    def timerEvent(self, event):
        if event.timerId() == self._resize_timer:
            self.updateResizeTimer()
            self.resizeCompleted.emit()

    def handleResizeCompleted(self):
        print('resize complete')

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.setGeometry(500, 300, 300, 300)
    window.show()
    sys.exit(app.exec_())
于 2014-04-26T12:15:07.360 に答える
0

FlowLayoutこの目的には、それを含むウィジェットのサイズを変更するときに列の数を自動的に調整する必要があると思います。ここにドキュメントがFlowLayoutあり、ここに同じレイアウトの PyQt バージョンがあります。

于 2014-04-26T04:59:42.667 に答える