下一步,我想要实现这样的效果:在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:
cpp
左侧 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。保存重启生效。
也支持代码中直接切换:
cpp
container->setContentClass("d");

此时就实现了动态加载类了,我可以写100个类,想要加载谁就加载谁,很方便。
对,已经实现了这种效果。
你可以编写 100 个 QWidget 子类,并在工厂中注册对应名称。之后只需在 main.ui 中设置容器的 contentClass,就能选择加载哪个类;同一个类也可以在多个容器中分别创建实例。
准确地说,这是运行时按名称创建已注册的类 。新增或修改 C++ 类需要编译;
在这些类之间选择、组合和调整布局,只需修改 UI 文件并重启程序。
如果以后希望"新增类也不用重新编译主程序",就可以进一步把内容类放到动态插件 DLL中。
Release v1.0.3:支持可配置 QWidget 容器与按名称加载内容类 · lianpeiliang/LearnFramework