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

标签 c++ qt

我想念任何Qt如果我替换 QApplication::exec() 的功能使用标准的 Windows 消息循环实现?这应该澄清我的意思:

运行事件处理的常用“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带有消息循环和 .dll 的程序(对 Qt 一无所知)使用 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)。之后,在您的应用程序 Qt 事件中调用 GetMessage 的人都会获得进程,而您就是黄金 :)

最佳答案

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

但更重要的问题可能是:你为什么要这样做,尤其是因为在 qeventdispatcher_win.cpp 中做的事情本质上是一样的?

关于c++ - Windows 消息循环而不是 QApplication::exec()/QApplication::processEvents(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16540743/

相关文章:

c++ - 为什么静态数据成员可能没有被初始化?

c++ - 如何删除 Qt 中 QDoubleSpinBox 的 setfill ('0' ) 特征?

c++ - 在嵌套模板特化期间初始化嵌套模板类的静态成员?

qt - 如何检查QSound是否可以成功播放声音

c++ - 在 C++ 中模拟按键以在虚拟键盘的 QML 中使用

c++ - 将C++ Builder应用程序与外部dll一起使用

c++ - 梳状排序在 C++ 中不起作用

c++ - libSoX 是线程安全的吗?

android - 交换 GridView 中的元素

qt - 布局 sizeHint qwidget