在运行时将Qt小部件添加到MainWindow

时间:2016-08-12 15:00:43

标签: c++ qt qt5

以下是我的情况:

我正在使用Windows 7 64位上的Qt 5.6在Creator / Designer中开发C ++应用程序

我正在设计一个骨架GUI,它本身并没有做太多。它主要提供了一种集成其他开发人员构建的工程工具的机制(如果你愿意的话,插件,不要把插件混淆到Qt本身)。骨架将安装在办公室周围的工作站上,它应该能够从网络位置拉出这些插件并将它们安装到骨架而无需重新编译。在启动时,骨架应该读取它插件列表并相应地构建其菜单,工具栏和UI小部件。

所以问题最终是这样的: Qt是否提供了一种在运行时将.ui文件和相关代码添加到QMainWindow的方法?

这样做是否可以在创建新插件时不必更改,重新编译和重新部署骨架?

关闭,但没有雪茄:以下是在Designer中创建的计算器用户界面的example被动态拉入另一个程序,但看起来此方法使用.ui文件。换句话说,框和按钮是从.ui文件中提取的,但它的逻辑是在“骨架”中实现的。我需要做一些类似于在运行时将计算器嵌入到自己的功能齐全的Widget中的东西。

附带问题:如果Qt没有提供一个很好的机制,那么让其他开发人员为我的特定情况编译他们的插件作为DLL是否有缺点?

1 个答案:

答案 0 :(得分:2)

对Qt应用程序的作用存在一些基本的误解。您看到的每个小部件都是通过执行C ++代码实例化的 - 它都是在运行时动态完成的。该uic采用foo.ui文件并将其转换为ui_foo.h。这定义了一个可以用子项填充基本小部件的类。

您可以使用QUiLoader来解析.ui文件并在运行时实例化其对象,但由于其他代码仍然是C ++,因此没有必要这样做,所以最简单的有插件将.ui文件转换为C ++的项目,然后编译其他代码并将它们链接到插件dll。

插件只是.dll,理想情况下提供Qt插件系统可以使用的功能,它具有所需的所有代码:来自.ui文件的代码通过uic,以及代码插件作者亲手写道。插件是一个对象工厂:它将创建QObject个实例,然后可以为您的骨架提供所需的所有小部件和其他对象。

这就是全部。插件是.dll,您当然可以自由地将它们从网络位置下载到缓存文件夹,并在运行时打开它们。

插件“与Qt本身”和应用程序的插件没有区别:Qt是C ++代码,就像你的应用程序一样。虽然它可以使用某些插件的功能,但其余部分则供您的代码使用。

为了获得灵感,你应该看看Qt Creator本身的来源。它是一个完全基于插件的应用程序,核心是一个插件容器,并没有做太多。也许您可以重复使用Qt Creator核心作为应用程序的基础,无需更改或进行非常小的更改。它将带有一个网络发现插件,可以从服务器获取剩余的插件并进入缓存,然后加载它们。这样的插件可能用150行代码编写,不包括最小的样板:)