如果我用标准的Qt消息循环实现替代QApplication::exec(),我会错过任何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一无所知),以及包含Qt和QApplication实例的.dll,那么可以让来自main.exe的外部消息循环来处理Qt的事件吗?提前感谢!
编辑1: --如果这对某人有用的话,我只会回答自己:我们有一个在.NET下用C#编写的主.exe模块,它运行事件循环处理,还有一对用Qt/C++编写的.dlls,它们有一个“内部”的GUI (以及一个共享的QApplication实例)。QApplication::exec()从不调用,但所有事件都由主.exe (.NET)模块的事件循环成功地分派,所有的Qt功能都存在(信号/时隙、线程等)。
编辑2:对QT4.8.2起作用的,但对于QT5.1.0则有点不同。现在,必须调用QApplication::processEvents()一次,因为它对第一个调用执行一些初始初始化(在GetMessage或PeekMessage上安装WindowsHook )。在此之后,无论谁在应用程序Qt事件中调用GetMessage,都会得到进程,您就是黄金:)
发布于 2013-05-14 13:44:52
我想到的第一件事是跨线程调用插槽不能工作,因为Qt事件循环正在执行这些调用。
但是更重要的问题可能是:为什么要这样做,特别是在qeventdispatcher_win.cpp中,基本上是一样的事情?
https://stackoverflow.com/questions/16540743
复制相似问题