在运行时向主窗口添加Qt小部件

Adding Qt Widgets to MainWindow at Run Time

本文关键字:Qt 小部 添加 窗口 运行时      更新时间:2023-10-16

我的情况如下:

我正在开发一个c++应用程序在Creator/Designer与Qt 5.6在Windows 7 64位

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

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

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

这是一个在Designer中创建的计算器UI被动态地拉入另一个程序的例子,但似乎这个方法只使用。UI文件。换句话说,框和按钮是从.ui文件中提取的,但其逻辑是在"框架"中实现的。我需要做一些类似于在运行时将计算器嵌入为其自己的全功能小部件的事情。

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

对于Qt应用程序的功能有一些基本的误解。你看到的每一个小部件都是通过执行c++代码实例化的——这一切都是在运行时动态完成的。uic将foo.ui文件转换为ui_foo.h文件。它定义了一个类,可以用子类填充基小部件。

您可以使用QUiLoader来解析.ui文件并在运行时实例化其对象,但是这样做没有什么意义,因为其他代码仍然是c++,所以最简单的是有一个插件项目将.ui文件转换为c++,然后沿着其他代码编译并将它们链接到插件dll中。

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

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

Qt本身的插件和应用程序的插件没有区别:Qt是c++代码,就像你的应用程序一样。虽然它可以使用一些插件的功能,但其余的都是由您的代码使用的。

要获得灵感,您应该查看Qt Creator本身的源代码。它是一个完全基于插件的应用程序,核心是一个插件容器,没有做太多的事情。也许您可以重用Qt Creator核心作为您的应用程序的基础,不做任何更改或只做很小的更改。它将附带一个网络发现插件,从服务器获取剩余的插件并进入缓存,然后加载它们。这样一个插件大概可以用150行代码编写,不包括最小的样板文件:)