我看到设计器生成的 UI 类使用 Qt 中的以下任何方法嵌入,
- 聚合作为指针成员
- 聚合
- 多重,私有继承
但据说第二种方法不支持自定义插槽。有人可以详细说明一下吗?为什么我们不能在使用聚合的同时实现自定义插槽?
此外,详细说明每种方法的优缺点。
我看到设计器生成的 UI 类使用 Qt 中的以下任何方法嵌入,
但据说第二种方法不支持自定义插槽。有人可以详细说明一下吗?为什么我们不能在使用聚合的同时实现自定义插槽?
此外,详细说明每种方法的优缺点。
我不认为第二个选项不支持自定义插槽是真的。
该选择在官方 Qt 文档中进行了讨论。见http://doc.qt.io/qt-4.8/designer-using-a-ui-file.html#compile-time-form-processing
但是,请注意,本文档中介绍的三种方法与 Qt Creator 中介绍的三个选项不对应。文档中介绍的第一种方法,直接方法,不是这里的三个选择之一——这种方法不能通过此设置控制的 Qt Creator 功能获得。第二个选项(聚合,或“单一继承方法”)有两种可用,细微的变化是 ui 类成员是作为数据成员(第二个选项)还是作为指针成员(第一个选项)。
我的偏好是第三种选择,多重继承。这也是使用Qt 4 进行 C++ GUI 编程(第一版可在线免费获得)中使用的方法,它称这种方法是最干净的。当我在编写我的课程时,我并没有真正考虑两个对象,一个带有 UI,另一个带有功能,我只考虑一个,多重继承与它最匹配。但是文档给出了为什么“聚合作为指针成员”是默认的原因。
QT5 更新:
如今,您可以以更多方式支持自定义插槽,例如使用 lambda 和对插槽的普通函数支持(查看此处)。
另外,请注意推荐的选项是Pointer Member,也称为 Pimpl idiom。优点是 UI 对象的前向声明将为更大的项目提供更快的编译时间,并且共享库将很容易打包(如此处所述)。