PySide: QTimer нужен QApplication для работы? - PullRequest
2 голосов
/ 08 февраля 2012

Только начал изучать PySide и у него проблемы с QTimer

У меня есть

#!/usr/bin/python

from PySide.QtCore import QThread;
from classes import Updater;

if __name__ == "__main__":
    thread = QThread();
    thread.start();

    update = Updater();
    update.moveToThread(thread);
    update.run();

и это

class Updater(QObject):
    def update_mode(self):
        #do something
        pass;

    def run(self):
        timer = QTimer();
        timer.timeout.connect(self.update_mode);
        timer.start(10);

Я хочу, чтобы мой скрипт периодически выполнял какую-то работу с использованием QTimer (хотел попробовать QSystemAlignedTimer, но сейчас это выглядит для меня еще более сложным ...). Не уверен, что сейчас не так, потому что я получаю эту ошибку

QObject::startTimer: QTimer can only be used with threads started with QThread
QEventLoop: Cannot be used without QApplication
QThread: Destroyed while thread is still running

1 Ответ

4 голосов
/ 08 февраля 2012

QTimer, наряду со всеми другими классами, основанными на событиях, должен существовать экземпляр QApplication.

В:

thread = QThread();
thread.start();

update = Updater();
update.moveToThread(thread);
update.run();

Прежде всего, избавьтесь от точек с запятой . Программисты Python не любят их. Если вы внимательно посмотрите на то, что делает ваш код, вы создаете QThread, запускаете его, делаете Updater, перемещаете его в поток, запускаете и завершаете программу. Здесь нет команды, говорящей Python, чтобы она продолжала работать, поэтому она заканчивается, и QThread жалуется на уничтожение.

Что вам нужно сделать, это сделать QApplication с чем-то вроде

app = QApplication(sys.argv)

и вызов app.exec_() для его запуска. В этом случае это по существу эквивалентно time.sleep(9999999999...), но на самом деле он обрабатывает события (сигналы / слоты) бесконечно. С time.sleep(9999999999...), QTimers никогда не будет ничего делать, когда истечет время ожидания.

Поскольку QApplication - это бесконечный цикл, вам придется вручную выйти из кода.

...