C++ Windows消息循环,而不是QApplication::exec()/QApplication::processEvents()
如果用标准Windows消息循环实现替换C++ Windows消息循环,而不是QApplication::exec()/QApplication::processEvents(),c++,qt,C++,Qt,如果用标准Windows消息循环实现替换QApplication::exec(),是否会错过任何Qt功能?这应该澄清我的意思: 运行事件处理的常用“Qt”方式: int main(int argc, char *argv[]) { QApplication a(argc, argv); Window w; w.show(); return a.exec(); } #include <Windows.h> int main(int argc, char *argv[]) {
QApplication::exec()
,是否会错过任何Qt
功能?这应该澄清我的意思:
运行事件处理的常用“Qt”方式:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Window w;
w.show();
return a.exec();
}
#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;
}
运行事件处理的“Windows”方式:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Window w;
w.show();
return a.exec();
}
#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;
}
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
窗口w;
w、 show();
味精;
while(GetMessage(&msg,0,0,0)){
翻译信息(&msg);
发送消息(&msg);
}
返回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()从未被调用,但所有事件都由main.exe(.NET)模块的事件循环成功调度,所有Qt功能都存在(信号/插槽、线程等)
编辑2:
这对Qt4.8.2有效,但对于Qt5.1.0,情况略有不同。现在,您必须调用QApplication::processEvents()一次,因为它在第一次调用时执行一些初始初始化(在GetMessage或PeekMessage上安装WindowsHook)。在这之后,无论谁在应用程序中调用GetMessage,Qt事件都会得到进程,而你就是黄金:)我想到的第一件事是跨线程调用插槽将不起作用,因为Qt事件循环正在执行这些调用
但更重要的问题可能是:为什么要这样做,尤其是在qeventdispatcher_win.cpp中,基本上做的是相同的事情?您可以创建一个只显示对话框的测试Qt DLL,然后从显示对话框的测试windows应用程序中执行它,并查看它是如何工作的。我做了,而且它似乎工作正常,但是我不确定是否在类
窗口
自定义类中启用了全部功能?@UmNyobe是的,它是从QMainWindow
派生的自定义类。您的应用程序将无法再使用套接字连接。GUI线程上的事件调度器通过调用MsgWaitForMultipleEvents
来处理这些事件。您既没有访问事件对象的权限,也没有框架发出相应的信号。不要在家里尝试这个,除非你对一个基本上可以工作的系统感到满意。这基本上是Qt的正常运行模式。谢谢你的回答。我应该创建GUI DLL,这些DLL将由已经有自己的消息循环的.NET应用程序使用。@Terenty Rezman在这种情况下,您可以定期调用QCoreApplication::processEvents()。加载DLL时,您可能还需要构造一个伪QApplication或QCoreApplication对象。我已经有一段时间没有做过类似的事情了(在MFC应用程序中运行的DLL中的Qt),但大部分都是在我做的时候工作的。