我有一个带有这种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()之前触发事件。这就是我需要知道事件循环何时真正开始的原因。
答案 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();