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

Par*_*avi 2 c++ qt templates qt5 qmetaobject

这里有一个类似的问题,正在寻找解决方法和一个很好的指南,它描述了 Qt 中的元对象系统。但这并不能直接解释为什么不能在元对象系统中使用模板类。这是一个令人烦恼的限制。

有人知道为什么吗?

And*_*dré 6

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

然而,有些事情可能的:

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

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