在主机应用程序中使用Qt用户界面

时间:2013-04-08 21:49:48

标签: c++ windows qt

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

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

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

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

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

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

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

最初我使用了QApplication.exec(),它阻止了所有内容,但很快我就学会了不要调用它。相反,我保留原始消息循环来自示例应用程序,在其中我调用QApplication.processEvent()。但它仍然无效。

我想知道,当Qt应用程序表现得如此不同时,那里发生了什么? Qt会阻止某些消息或正在发生的事情吗?

我也试图整合QWinWidget,但它有类似的效果。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

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

希望有所帮助。

答案 2 :(得分:0)

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

如果您真的想将Qt添加到该混音中,QWinWidget会显示出来。

您也可以尝试我的htmlayout或sciter引擎,以便将您的UI定义为HTML / CSS。