如何通过元编程创建基于Q_OBJECT的类(具有信号和/或插槽的类)?我不在乎它是模板还是预处理器,它们似乎都不起作用,我也真的需要它。
我想要的是能够将任意函数与Qt信号绑定。 Qt信号无法实现,增强信号也是如此。因此,我需要一个可以连接到Qt信号的Qt对象,并将其简单地转发到升压信号。我需要做一堆,所以自动化会很好。
主要问题似乎是 - 毫不奇怪 - moc处理器。它不了解基本的预处理(除了ifs),显然也不能做模板类。
有什么想法吗?
答案 0 :(得分:1)
以下是我发现的关于Qt moc系统的内容:
使用部分http://www.codeproject.com/KB/cross-platform/qt_reversing.aspx ...
因为我知道生成的对象将有一个单一的插槽,而没有其他东西(这就是它的用途)应该可以使用预处理器生成moc内容,尽管可能很难。
qt_moc_data _ ??? []数组中的大多数信息都可以进行硬编码。唯一的兴趣点似乎是插槽,而且只有一个。其余的可以是{ 5, 0,0,0,1,14,0,0,0,0,0,0,0,0 ... slot line ...., 0}
上面的链接描述了插槽行。
qt_moc_stringdata _ ???需要像:#object_name "\0\0" (param > 1 ? param-1:0 count commas) "\0" #functionname #paramtypelist
我相信所有这些都可以通过预处理器生成。棘手的部分是插槽行必须包含为qt_moc_stringdata提供索引的数字_ ???
还有一些需要生成的函数,以及QMetaClass类型的变量等等......除了调用者必须重新解释所有参数之外,其中大部分内容都应该是相当直接的。 / p>
尽管如此,我相信预处理器可以生成所有这些,这似乎是唯一的方法。我从qtcenter论坛获得的唯一帮助是使用:
#ifdef MYCLASS
struct myclass : QObject
{
... a QObject definition...
};
#endif
......而这完全不足以完成任务。有时人们给出的答案让我感到惊讶。
不幸的是,当然,所有这些魔法在很大程度上取决于所用moc的版本。
我找到了一种更好,更简单的方法来实现这一目标。我已经开始撰写关于创建这个怪物的博客文章系列。见http://crazyeddiecpp.blogspot.com/2011/01/quest-for-sane-signals-in-qt-step-1.html