LoginSignup
9
8

More than 5 years have passed since last update.

PySide - モードレスダイアログを表示中にバックグラウンドで何らかの処理を行う

Posted at

PySideでモードレスダイアログを表示する場合はshowメソッドを使用しますが、
呼び出し元で何らかの処理が継続中の場合、
その処理が終わるまでダイアログは待ち状態になってしまいます。

それを防ぐためには、モードレスダイアログの中で定期的に
QtGui.QApplication.processEvents()を呼び出す必要があります。
(QProgressbarDialogなどもsetValueメソッドの中でprocessEventsを呼び出し
ダイアログを定期的に更新しています)

以下、時間のかかる処理を行う際に、「Please wait...」と書かれたモードレスダイアログ
を表示させる例です。

import sys
from PySide import QtGui, QtCore


class WaitDialog(QtGui.QDialog):

    def __init__(self, parent=None):
        super(WaitDialog, self).__init__(parent)

        label1 = QtGui.QLabel("Please wait...")

        layout = QtGui.QVBoxLayout()
        layout.addWidget(label1)
        self.setLayout(layout)

        self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
        self.setWindowTitle("Work in progress")
        self.resize(200, 100)
        self.setModal(True)
        self.show()
        self.raise_()
        QtGui.QApplication.processEvents()


def main():
    app = QtGui.QApplication(sys.argv)
    widget = WaitDialog()
    u""" 時間のかかる処理開始 """
    import time
    time.sleep(10)
    u""" 時間のかかる処理終了 """
    widget.close()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()
9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8