Qt: Есть ли уведомление о запуске цикла событий?

У меня есть приложение 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(). Вот почему мне нужно знать, когда цикл событий действительно начался.

Ответы

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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();