为什么不能将 Q_OBJECT 与模板 类 一起使用?

Why is it not possible to use Q_OBJECT with template classes?

有一个类似的问题 here that was looking for a workaround and a nice guide here 描述了 Qt.But 中的元对象系统,但没有直接解释为什么不能在元中使用模板 class -object system.That 是一个恼人的限制。

有人知道为什么吗?

在标准 Qt 中是不可能的*,至于 Qt,至于这些 classes moc 需要能够预处理 class 并生成所需的元数据结构。这是在编译之前完成的,对于模板 class 这意味着类型还没有真正定义。

但是,有些事情可能的:

  • QObject 可以有模板方法,只要它们没有被标记为可调用、槽或信号。
  • 您可以创建一个模板 class 来继承 QObject 派生的 class。它不能有一个 Q_OBJECT 宏或添加信号、槽或属性,但它可以是一个有用的技巧,例如创建一个模板化的通用 QAbstractItemModel。
  • 您可以使用 Verdegris 而不是 moc。它使用基于模板的替代方法来生成与 moc 兼容的代码。这也应该允许模板化 QObjects。

*)当然没有什么是不可能的...如果一切都失败了,你也可以自己实现moc提供的一切...