如果我用标准的Windows消息循环实现替代QApplication::exec()
,我会错过任何Qt
功能吗?这应该能澄清我的意思:
通常的"Qt"方式来运行事件处理:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Window w;
w.show();
return a.exec();
}
" Windows "运行事件处理的方式:
#include <Windows.h>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Window w;
w.show();
MSG msg;
while(GetMessage(&msg, 0, 0, 0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
上面演示了QApplication
实例的外部消息循环,而QApplication
实例本身甚至没有自己的事件循环。
换句话说,如果我有main.exe
程序(对Qt一无所知)与消息循环和.dll
与Qt GUI和QApplication
实例里面,它可以让外部消息循环从main.exe
来处理Qt GUI的事件吗?提前感谢!
编辑1:我自己回答吧,以防对别人有用:我们有一个主要的。exe模块在。net下用c#编写,运行事件循环处理,我们有几个用Qt/c++编写的。dll,"内部"有一个GUI(和一个共享的QApplication实例)。QApplication::exec()永远不会被调用,但是所有的事件都被主.exe (. net)模块的事件循环成功地调度,并且所有的Qt功能都存在(信号/槽,线程等)
编辑2:这在Qt 4.8.2中工作,但在Qt 5.1.0中情况略有不同。现在您必须调用QApplication::processEvents()一次,因为它在第一次调用时执行一些初始化(在GetMessage或PeekMessage上安装WindowsHook)。之后,谁调用GetMessage在您的应用程序Qt事件得到进程,你是金色的:)
我想到的第一件事是跨线程调用槽不会工作,因为Qt事件循环正在执行这些调用。
但更重要的问题可能是:为什么你想这样做,尤其是在qeventdispatcher_win.cpp中做本质上相同的事情?