【发布时间】:2020-07-21 18:25:45
【问题描述】:
有一个类似的问题 here 正在寻找一种解决方法和一个很好的指南 here 它描述了 Qt 中的元对象系统。但这并不能直接解释为什么不能使用模板类在元对象系统中。这是一个烦人的限制。
有人知道为什么吗?
【问题讨论】:
-
好吧可能是由宏生成的东西引起的,如果每个类都必须有一些唯一的 Q_OBJECT id(示例),则模板的不同实例化将产生具有相同 ID 的不同类,因为宏是在编译之前执行的,但这只是一个想法,因为我知道 Q_OBJECT 宏产生了什么
-
这听起来像是 xy 问题。你想达到这个特定限制禁止的目的是什么?
-
@G.M.我想编写一个辅助类来在大量
.ui文件中运行所需形式的->setupUi。问题是这些形式的顶级类不同(例如QDialog 或QMainWindow)所以我决定使用模板如果那个助手类不使用信号和槽机制(这里就是这种情况),那么没问题。但我想知道为什么会有这样的限制?跨度> -
@Berto99 好主意。事实上,data structure 关于元对象系统中的类比 id 更复杂,但如果类签名应该具有相同
QMetaObject实例的实例不同。所以moc将阻止您在包含 Q_OBJECT 的类中使用模板。 -
您可以在基类中有一个 void*(或基类型)信号,并让模板类(对应于实际类型)连接到重新解释返回的模板槽(很像 moc 开始时所做的事情和)。您也可以只使用自动生成的 moc 代码并将模板添加到类定义中,尽管我只会在私人项目中这样做。
标签: c++ qt templates qt5 qmetaobject