下一步,我想要实现这样的效果:在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