2012-01-16 82 views
14

我有这样的main()的Qt应用程序...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使用Qt信号,插槽,定时器等,所以在事件循环运行之前(通过exec())它并没有真正做好准备。

我的问题是:是否有一些信号或事件是在事件循环开始时发出的?

请考虑这一点。在mainWin.Init()中,你可以创建类似QTimer的东西,甚至可以调用.start()来启动它。但它不会实际运行并触发事件,直到调用exec()。这就是为什么我需要知道事件循环何时真正开始。

+0

你的线程是Qt线程还是native? – UmNyobe 2012-01-16 09:25:24

回答

9

您可以将exec()调用之前将信号发送到你的窗口。这会在app的信号队列中输入一个条目。 当exec()正在运行时,信号将被传递,您的窗口将知道事件循环正在运行。

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

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

仅供参考,这似乎不适用于PyQt。在调用app.exec_()之前以某种方式发送和处理信号。 – orodbhen 2016-03-16 21:12:01

2

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