C ++预处理器和QT MOC

时间:2018-03-07 12:58:46

标签: qt c-preprocessor moc

我正在尝试某些事情(也许是愚蠢的)。

使用了一些宏来在C ++域中创建“数量”的函数;

#define THR_CONFIG_VALUE(path, value, type, name, defaultvalue) \
    type name() { return m_##name; } \
    void set##name(type data) { m_##name = data; }
#include <backend/config.i>
#undef THR_CONFIG_VALUE

基于以下config.i文件:

THR_CONFIG_VALUE("", "type", int, ThisType, 0)
THR_CONFIG_VALUE("", "auto", bool, AutoVar1, false)
THR_CONFIG_VALUE("", "auto", bool, AutoVar2, false)

工作正常,我得到了许多getter setter函数,也以相同的方式生成成员变量(用于记录)。

现在我开始混淆QT的东西,尝试使用MOC来生成Q_PROPERTIES:

#define THR_CONFIG_VALUE(path, value, type, name, defaultvalue) \
    Q_PROPERTY(type name READ name WRITE set##name NOTIFY indexChanged)
#include <backend/vessel/thruster/thruster_config.i>
#undef THR_CONFIG_VALUE

MOC不关心此类尝试。这样可以省去我输入170张Q_PROPERTY线,以及将来还有几百张。

问题1:为什么,预处理器和MOC序列? 问题2:是否有“QT方式”?

谢谢,

3 个答案:

答案 0 :(得分:0)

Qt有自己的方法来生成基于变量名称的getter和setter。

查看property system

答案 1 :(得分:0)

我为Qt实现了一个可以满足您需求的宏,但它必须在QObjectQ_GADGET的上下文中使用。 (Q_PROPERTY不能在他们之外使用。)

当我第一次编写宏时,我不明白Q_PROPERTY不会生成setter,getter,notification方法,甚至不会生成值的存储。那些需要单独生成(在宏中很容易)。

NOTIFY的{​​{1}}部分需要定义Q_PROPERTY。由于在调用预处理器之前信号由MOC编码为C ++,因此使用signal将不起作用。 (我在代码中不使用#define。)

不完整的例子:

NOTIFY

答案 2 :(得分:0)

现在我有一个有效的实现。使用了Verdigris的贡献。

有点棘手,不得不启用c ++ 14并将此定义添加到PRO文件中:

DEFINES += __cpp_constexpr=201304 __cpp_variable_templates=201304

同样,我使用名称空间;必须在命名空间内执行包含:

FRONTEND_BEGIN_NAMESPACE

#include <frontend/gui/helper/wobjectdefs.h>

然后它起作用:

#define THR_CONFIG_VALUE(path, value, type, name, defaultvalue) \
    W_PROPERTY(type, name MEMBER m_##name) 
#include <backend/config.i>
#undef THR_CONFIG_VALUE