Windows消息循环而不是QApplication :: exec()/ QApplication :: processEvents()

时间:2013-05-14 10:25:42

标签: c++ qt

如果我将Qt替换为标准的Windows消息循环实现,我会错过任何QApplication::exec()功能吗?这应该澄清我的意思:

运行事件处理的因果“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: 我会回答自己,以防它对某人有用: 我们在.NET下使用C#编写了一个主要的.exe模块来运行事件循环处理,我们有几个用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事件都会获得进程并且你是金色的:)

1 个答案:

答案 0 :(得分:1)

我想到的第一件事是跨线程调用插槽将无法工作,因为Qt事件循环正在执行这些调用。

但更重要的问题可能是:为什么你要这样做,特别是因为在qeventdispatcher_win.cpp中做的基本上是同样的事情?