2010-12-01 44 views
1

如何通过元编程来制作基于Q_OBJECT的类(具有信号和/或插槽的类)?我不在乎它是模板还是预处理器,既不可行,也非常需要它。实际生成Qt Q_OBJECT类

我想要的是能够像Qt信号一样绑定任意函数。 Qt信号是不可能的,升压信号是。所以,我需要一个Qt对象,它可以连接到一个Qt信号,并简单地将它转发给一个升压信号。我需要这么做,所以自动化会很好。

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

任何想法?

+0

根据我的经验,使用模板和QObject进行任何操作都很麻烦。我只能想象它将如何改变我们的问题。 – 2010-12-01 00:07:44

回答

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类型的变量或其他东西......除了调用者必须重新解析所有参数之外,大多数东西应该是相当直接的。

尽管如此,我相信预处理器可以生成它的全部内容,而且这似乎是唯一的方法。我从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