Windows消息循环代替QApplication::exec() / QApplication::processEve

Windows message loop instead of QApplication::exec() / QApplication::processEvents()

本文关键字:QApplication processEve exec 消息 Windows 循环      更新时间:2023-10-16

如果我用标准的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中做本质上相同的事情?