问:事件循环开始时是否有通知?

时间:2012-01-16 06:18:20

标签: qt events signals-slots event-loop

我有一个带有这种main()的Qt应用程序......

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 个答案:

答案 0 :(得分:13)

您可以在exec()来电之前向您的窗口发送信号。这将在app的信号队列中放置一个条目。 当exec()正在运行时,信号将被传递,您的窗口将知道事件循环正在运行。

一种简单的方法是使用连接到窗口类的自定义插槽的QTimer::singleShot(0, &mainWin, SLOT(onEventLoopStarted()));

答案 1 :(得分:2)

由于在事件循环尚未运行时发出的信号不会丢失,因此您的线程可能不一定需要知道窗口何时准备就绪。
您的线程可以立即开始向窗口发送信号,但是当事件循环运行时,它只会从窗口接收信号

答案 2 :(得分:1)

您可以按以下顺序执行此操作:

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