2013-04-08 34 views
0

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

也可以为这些插件编写用户界面。由于主机应用程序是从另一个平台移植的,因此用户界面将窗口用作主窗口和对话框的主要容器,但窗口内容及其控件是由所有者绘制的。它们有一个标准的资源文件,标准的窗口过程,标准的对话框过程,使用GetMessage()的标准事件循环,TranslateMessage(),TranslateMessage (),DispatchMessage()。

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

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

甚至有可能,或更好的,因为简单的例子,设计它是不是不允许调用命令多次,这将打开同类多个窗口,仍然看起来一切正常。

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

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

我在想,当Qt应用程序表现如此不同时发生了什么? Qt阻止了一些消息或者发生了什么?

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

+0

我会说更有可能的东西是吃东西的消息。 – user1095108 2013-04-08 22:03:43

回答

0

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

事件系统的文档可以摆脱更多的光线,为什么它从插件阻断循环/ DLL文件使用的是:

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

希望有所帮助。

0

你不需要自己的消息泵(GetMessage函数()的TranslateMessage(),DispatchMessage函数()循环)为主机应用程序都运行自己了。

QWinWidget是一种适合你的方式,如果你真的想把Qt加入到混合中。

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

1

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

相关问题