Как выполнить метод автоматически после входа в цикл событий Qt? - PullRequest
2 голосов
/ 02 июня 2011

Я хотел бы выполнить метод, который можно вызвать только после отображения моего QApplication, т. Е. Когда он вошел в свой основной цикл событий exec_(). Я новичок в Qt4 (использую PyQt4): я надеялся получить обратный вызов on_start(), но не нашел. Мне нужно создать поток или таймер? Или в API уже есть какой-то обратный вызов?

Ответы [ 3 ]

4 голосов
/ 02 июня 2011

Для этого можно использовать однократный таймер, как в следующем простом сценарии:

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
0 голосов
/ 03 июня 2011

На данный момент я решил использовать 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() не был создан как потомок QApplication, я бы не сталНе знаю, как передать сигнал с app на w

Я подожду лучшего ответа, если таковой будет, прежде чем принять мой ответ в качестве выбранного решения.

0 голосов
/ 02 июня 2011

Я раньше не использовал Qt, так что я могу ошибаться, но я думаю, что вы можете связать свой метод on_start() с событием ApplicationActivate и установить флаг внутри вашего метода on_start(), чтобы код будет запускаться только в первый раз, а не в любое другое время, когда событие ApplicationActivate запускается во время выполнения вашей программы.

С другой стороны, если метод on_start() будет вызываться несколькими потоками, вы можете использовать флаги, специфичные для потока. Я не много занимался многопоточностью, поэтому я не уверен, что это за специфика, или насколько она проста / сложна.

...