☰
插件式框架学习(3)
2026/10/26 10:24:42 网站建设 项目流程

下一步,我想要实现这样的效果:在main.ui中,可以动态载入QWidget相关的类,你理解吗,这首先需要一种自定义的QWidget子类b,作为一个容器,比如,在我的main.ui中,左边是b,右边也是b。我还有3个QWidget子类c,d,e。我可以随意选择使用c,d,e中的任意一个,它们的外壳的类b。你理解我的想法吗

理解。你想让b成为一个通用容器,c、d、e成为可替换的内容窗口。

比如main.ui里放两个b:

主窗口 main.ui ┌─────────────────┬─────────────────┐ │ 左侧容器 b │ 右侧容器 b │ │ │ │ │ 当前装入 c │ 当前装入 e │ │ │ │ └─────────────────┴─────────────────┘

之后你可以把左侧换成d,右侧换成c。

两个容器独立选择,负责承载内容,并让内容自动填满容器。

结合当前的外部.ui加载方式,可以这样实现:

  • 容器类b:继承QWidget,提供装入、替换内容窗口的能力。
  • 内容类c、d、e:各自继承QWidget,实现不同的界面和业务。
  • 窗口工厂:根据名称,例如"c"、"d"、"e",创建对应窗口。
  • 自定义QUiLoader:加载main.ui时,识别并创建容器b。

还可以在 Designer 中给每个b设置一个动态属性,例如contentClass:

左侧 b:contentClass = "c" 右侧 b:contentClass = "e"

程序读取这个属性,将对应内容装进去。这样你只需修改main.ui中的配置,再重启程序,就能改变左右两边使用的内容。

这里的边界是:c、d、e的 C++ 实现需要先编译进程序或插件;之后选择它们装在哪个容器里,可以通过 UI 文件配置,无须重新编译。

如果理解无误,你要做的就是:在.ui中编排容器,通过类名配置每个容器承载的 QWidget 内容。


已实现并编译通过:

  • WidgetContainer对应你的容器b。
  • CWidget / DWidget / EWidget分别演示计数、文本输入和列表。
  • 默认左侧加载c,右侧加载e。

编辑main.ui,将容器的contentClass改为c,d或e。保存重启生效。


也支持代码中直接切换:

container->setContentClass("d");

此时就实现了动态加载类了,我可以写100个类,想要加载谁就加载谁,很方便。


对,已经实现了这种效果。

你可以编写 100 个QWidget子类,并在工厂中注册对应名称。之后只需在main.ui中设置容器的contentClass,就能选择加载哪个类;同一个类也可以在多个容器中分别创建实例。

准确地说,这是运行时按名称创建已注册的类。新增或修改 C++ 类需要编译;

在这些类之间选择、组合和调整布局,只需修改 UI 文件并重启程序。

如果以后希望“新增类也不用重新编译主程序”,就可以进一步把内容类放到动态插件 DLL中。


Release v1.0.3:支持可配置 QWidget 容器与按名称加载内容类 · lianpeiliang/LearnFramework

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询