4

QApplicationmyが表示されたとき、つまりメインイベントループに入ったときにのみ呼び出すことができるメソッドを実行したいと思いますexec_()。私はQt4を初めて使用します(PyQt4を使用):-のon_start()ようなコールバックが欲しいと思っていましたが、見つかりませんでした。スレッドまたはタイマーを作成する必要がありますか?または、APIにすでにコールバックが含まれていますか?

4

3 に答える 3

5

次の簡単なスクリプトのように、これにはシングルショット タイマーを使用できます。

import sys
from PyQt4 import QtGui, QtCore

app = QtGui.QApplication(sys.argv)

def on_start():
    print(' in event loop!')
    print(' telling app to exit ...')
    app.exit(123)

QtCore.QTimer.singleShot(0, on_start)
print('About to enter event loop')
rc = app.exec_()
print('All done - returned %d' % rc)

これを実行すると、表示されるはずです

About to enter event loop
 in event loop!
 telling app to exit ...
All done - returned 123
于 2011-06-02T19:19:17.253 に答える
0

私は以前にQtを使用したことがないので、これは間違っているかもしれませんが、on_start()メソッドをApplicationActivateイベントにバインドし、メソッド内からフラグを設定しon_start()て、コードが最初にのみ実行され、実行されないようにすることができると思いますそれ以外のApplicationActivate場合は、プログラムの実行中にイベントがトリガーされます。

一方、on_start()メソッドが複数のスレッドによって呼び出される場合は、スレッド固有のフラグを使用することをお勧めします。自分でマルチスレッド化をあまり行っていないので、その詳細が何であるか、またはそれがどれほど単純/複雑になるかはわかりません。

于 2011-06-02T18:47:06.583 に答える
0

今のところ、私はQThreadこの方法を使用することを選択しました:

class MyThread(QtCore.QThread):
    def run(self):
    ''' reinplemented from parent '''
        # make thread sleep to make sure
        # QApplication is running before doing something
        self.sleep(2)
        do_something()

class MyWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.attr = 'foo'
        self.thread = MyThread(self)
        self.thread.start()

def main():
    app = QtGui.QApplication(sys.argv)
    w = MyWidget()
    w.show()
    sys.exit(app.exec_())

私の(実際の)コードの私のスレッドは実際にXディスプレイのアプリケーションウィンドウを探し、それが見つかるまでそうしようとするので、それは私の目的のために機能します。しかしそうでなければ、それは問題を解決するエレガントな方法ではありません。QApplicationイベントループに入ったときにによって発せられる信号があればもっといいでしょう。JAB はQt.ApplicationActivateを提案しましたが、 によって発行されQApplicationているようには見えません。MyWidget()QApplicationappw

私の回答を選択した解決策として受け入れる前に、より良い回答があればそれを待ちます。

于 2011-06-02T20:15:07.543 に答える