以实用方式生成Qt Q_OBJECT类

时间:2010-12-01 00:03:16

标签: c++ qt

如何通过元编程创建基于Q_OBJECT的类(具有信号和/或插槽的类)?我不在乎它是模板还是预处理器,它们似乎都不起作用,我也真的需要它。

我想要的是能够将任意函数与Qt信号绑定。 Qt信号无法实现,增强信号也是如此。因此,我需要一个可以连接到Qt信号的Qt对象,并将其简单地转发到升压信号。我需要做一堆,所以自动化会很好。

主要问题似乎是 - 毫不奇怪 - moc处理器。它不了解基本的预处理(除了ifs),显然也不能做模板类。

有什么想法吗?

1 个答案:

答案 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