我正在尝试某些事情(也许是愚蠢的)。
使用了一些宏来在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方式”?
谢谢,
答案 0 :(得分:0)
Qt有自己的方法来生成基于变量名称的getter和setter。
答案 1 :(得分:0)
我为Qt实现了一个可以满足您需求的宏,但它必须在QObject
或Q_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