Qt: Есть ли уведомление о начале цикла событий? - PullRequest
17 голосов
/ 16 января 2012

У меня есть приложение Qt с таким видом main () ...

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow   mainWin;

    ... A separate, non-GUI thread is launched here

    mainWin.Init();
    mainWin.show();

    app.exec();
}

Этот другой поток, созданный до того, как mainWin должен знать, когда он может начать связь с mainWin. Но поскольку mainWin использует сигналы Qt, слоты, таймеры и т. Д., Он не готов к работе до тех пор, пока не будет запущен цикл обработки событий (через exec ()).

Мой вопрос: есть ли какой-нибудь сигнал или событие, которое испускается при запуске цикла событий?

Учтите это. В mainWin.Init () вы можете создать что-то вроде QTimer и даже вызвать .start (), чтобы запустить его. Но на самом деле он не будет запускаться и вызывать события до тех пор, пока не будет вызвана exec (). Вот почему мне нужно знать, когда цикл событий действительно начался.

Ответы [ 3 ]

13 голосов
/ 16 января 2012

Вы можете отправить сигнал в свое окно до вызова exec().Это поместит запись в очередь сигналов app.Когда exec() работает, сигнал будет доставлен, и ваше окно будет знать, что цикл обработки событий работает.

Простой способ - использовать QTimer::singleShot(0, &mainWin, SLOT(onEventLoopStarted()));, который подключается к пользовательскому слоту вашего класса окна..

2 голосов
/ 16 января 2012

Поскольку испускаемые сигналы не теряются, когда цикл событий еще не запущен, вашему потоку необязательно нужно знать, когда ваше окно готово.
Ваш поток может начать посылать сигналы в окно сразу, но он будет получать сигналы из окна только тогда, когда работает цикл обработки событий.

1 голос
/ 16 января 2012

Вы можете сделать это в следующем порядке:

QApplication app(argc, argv);
Mainwinwdow mainWin;
QThread yourThread;

//connect the signals from the thread to the mainWin here

mainWin.Init();
mainWin.show();

yourThread.start();

return app.exec();
...