Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Windows消息循环,而不是QApplication::exec()/QApplication::processEvents()_C++_Qt - Fatal编程技术网

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

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[]) {

如果用标准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 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),但大部分都是在我做的时候工作的。