0

我正在扩展一个在 Windows 上运行的商业应用程序。它可以通过插件进行扩展,对于这个应用程序来说,插件是普通的 DLL。从插件 DLL 导出的自由函数可以挂接到主机应用程序 UI,形成命令,并且这些命令可以基于用户与主机应用程序 UI 的交互来使用。此外,看起来插件与宿主应用程序在同一个线程中运行,或者至少所有插件都在同一个线程中运行。

也可以为这些插件编写用户界面。由于宿主应用程序是从另一个平台移植的,用户界面使用窗口作为主窗口和对话框面板的主要容器,但窗口内容及其控件是所有者绘制的。

应用程序附带的示例插件使用编写 Windows 用户界面的老式方式 - 它们具有标准资源文件、标准窗口过程、标准对话框过程、使用 GetMessage()、TranslateMessage()、DispatchMessage 的标准事件循环()。

这些示例插件中的 Windows 是在插件 DLL 函数之一中创建的。事件循环也在那里运行。

在这些示例中,可以创建模态和非模态窗口,并且集成似乎工作正常。只是视觉风格“有点”混合。

甚至有可能,或者更好的是,由于简单的示例设计,不允许多次调用该命令,这会打开多个相同类型的窗口,但看起来一切正常。

我想将 Qt 用于我的插件的 UI。但是,当我这样做时,主机用户界面就会停止反应。它甚至没有重新粉刷。

最初我使用 QApplication.exec(),它阻止了一切,但很快我就学会了不调用它。相反,我保留示例应用程序中的原始消息循环,并在其中调用 QApplication.processEvent()。但它仍然不起作用。

我想知道,当 Qt 应用程序的行为如此不同时,那里发生了什么?Qt 是否阻止了某些消息或发生了什么?

我也尝试过集成QWinWidget,但效果类似。

4

3 回答 3

1

我想到的一种解决方案是使用 QtConcurrent::run() 在单独的线程中调用插件。它返回 QFuture 对象,该对象可用于使用 QFuture::waitForFinished() 等待线程,从而使用 Qt 应用程序的事件循环。QFuture 的模板参数可用于从函数返回结果。希望这可以帮助

于 2013-04-10T10:52:27.897 回答
0

我将与 a 中的标准事件循环元素和消息QThread进行交互,然后使用信号和插槽与 Qt GUI 进行交互。Qt 的事件循环系统可能类似于其他操作系统的事件循环,但它也为内存管理和其他各种自身独有的事情做了很多事情。

事件系统的文档可能会更清楚地说明为什么它会阻止您正在使用的插件/dll 的循环:

http://qt-project.org/doc/qt-4.8/eventsandfilters.html

希望有帮助。

于 2013-04-08T22:27:55.987 回答
0

您不需要自己的消息泵(GetMessage()、TranslateMessage()、DispatchMessage() 循环),因为主机应用程序已经在运行它自己的。

如果您真的想将 Qt 添加到该组合中,它似乎是 QWinWidget 适合您的方式。

你也可以试试我的 htmlayout 或 sciter 引擎,这样你的 UI 将被定义为 HTML/CSS。

于 2013-04-08T22:45:57.363 回答