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

C++ 在运行时将Qt小部件添加到MainWindow,c++,qt,qt5,C++,Qt,Qt5,以下是我的情况: 我在Windows 7×64位< /p >中用Qt 5.6开发了Cule/Designer中的C++应用程序 我正在设计一个框架图形用户界面,它本身做不了多少事情。它主要提供一种机制来集成由其他开发人员构建的工程工具(如果您愿意,请不要将插件与Qt本身混淆)。该框架将安装在办公室周围的工作站上,它应该能够从网络位置拉出这些插件并将它们安装到框架中,而无需重新编译。在启动时,框架应该读取其插件列表,并相应地构建其菜单、工具栏和UI小部件 所以问题最终是这样的:Qt是否提供了一种在

以下是我的情况:

我在Windows 7×64位< /p >中用Qt 5.6开发了Cule/Designer中的C++应用程序 我正在设计一个框架图形用户界面,它本身做不了多少事情。它主要提供一种机制来集成由其他开发人员构建的工程工具(如果您愿意,请不要将插件与Qt本身混淆)。该框架将安装在办公室周围的工作站上,它应该能够从网络位置拉出这些插件并将它们安装到框架中,而无需重新编译。在启动时,框架应该读取其插件列表,并相应地构建其菜单、工具栏和UI小部件

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

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

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


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

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

可以使用<代码> QUiLoader <代码>解析<代码> .uI/Cux>文件并在运行时实例化它,但由于其他代码仍然是C++,所以没有什么意义,所以最简单的是将一个插件项目转换为C++代码。然后将它们与其他代码一起编译,并将它们链接到插件dll中

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

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

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


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

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

可以使用<代码> QUiLoader <代码>解析<代码> .uI/Cux>文件并在运行时实例化它,但由于其他代码仍然是C++,所以没有什么意义,所以最简单的是将一个插件项目转换为C++代码。然后将它们与其他代码一起编译,并将它们链接到插件dll中

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

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

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


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

你坚持使用
.ui
文件吗?所有的“新”东西都是QML,所以我想最好是通过代码(绑定到插件接口)或其他特定的元文件对插件UI进行某种框架描述。然后你可以提取所有你需要的信息(什么样的信息