1

ですから、タイトルが最適な説明かどうかはわかりませんが、思いついたものです。これが取引です。私は、フォルダーにいくつかのサブクラスを追加するだけでアプリがそれらを見つけることができる一種のプラグインシステムを持つPyQtアプリに取り組んでいます。これらのコマンドには、独自の小さな UI を作成できるオプションがあります。基本的に、それらは次のようになります。

class Command(object):
    def do(self):
        self.setupUi()
        self.pre()
        self.run()
        self.post()

    def pre(self):
        # do setup stuff for run method

    def run(self):
        # do actual work

    def post(self):
        # clean up after run

    def setupUi(self):
        # create a ui for this command
        diag = QDialog()
        diag.exec_()

今、私が直面している問題は、ダイアログを作成し、ユーザーがそれを受け入れるのを待つ 1 つのコマンドがあることです。次に、コマンドの実行中にダイアログを非モーダルに切り替え、ダイアログを更新する必要があります。これはすべてうまくいくようです。しかし、問題は、pre、run、および post メソッドが終了するまで、ダイアログを再描画できないことです。したがって、次のような setupUi がある場合:

def setupUi(self):
    # create a ui for this command
    diag = QDialog()
    if diag.exec_():
        diag.setModal(False)
        diag.show()

processEvents を試しましたが、うまくいかなかったようです。他の誰かがこの問題に遭遇しましたか、または回避策を知っていますか?

ありがとう

4

1 に答える 1

0

を使用diag.exec_()すると、ダイアログが戻る (閉じられる) までブロックされます。そのため、自分で呼び出す必要がある場合show()。ここから先に進むにはいくつかの方法があります。

  1. ダイアログに、残りのコマンドへの参照を実行するスロットを受け入れるようにさせることができます
  2. ダイアログをポーリングして、ユーザーが同意したかどうかを確認できます
  3. prerun、およびpostコマンドをダイアログに移動できます。

コードの本質をダイアログ クラスから除外したいと仮定し、可能であれば定期的なポーリングを避けるのが最善であるため、最初の戦略の例を次に示します。

import sys, time

from PyQt4 import QtCore, QtGui

class MyDialog(QtGui.QDialog):
    def __init__(self,parent=None):
        QtGui.QDialog.__init__(self,parent)
        layout = QtGui.QVBoxLayout()
        self.msg = QtGui.QLabel('some sort of status')
        self.buttonbox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok, QtCore.Qt.Horizontal, self)
        self.buttonbox.accepted.connect(self.accept)
        layout.addWidget(self.msg)
        layout.addWidget(self.buttonbox)
        self.setLayout(layout)

    def set_msg(self, new_msg):
        self.msg.setText(new_msg)

    def set_function_on_accept(self,fcn):
        self.function = fcn

    def accept(self):
        self.function()


class Command(object):
    def do(self):
        self.setupUi()

    def do_work(self):
        self.pre()
        self.run()
        self.post()

    def pre(self):
        # do setup stuff for run method
        time.sleep(1)
        self.diag.set_msg("stuff setup")
        QtGui.QApplication.processEvents()

    def run(self):
        # do actual work
        time.sleep(1)
        self.diag.set_msg("work done")
        QtGui.QApplication.processEvents()

    def post(self):
        # clean up after run
        time.sleep(1)
        self.diag.set_msg("cleaned up")
        QtGui.QApplication.processEvents()

    def setupUi(self):
        # create a ui for this command
        diag = MyDialog()
        self.diag = diag
        diag.set_function_on_accept(self.do_work)
        diag.show()

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    command = Command()
    command.do()
    sys.exit(app.exec_())
于 2013-09-15T18:01:53.743 に答える