在QT5.12中,我想做一个保存配置的元对象类,每一个属性都有格式相同的set,get,notify。于是我想着用一个宏来包装一个属性的定义,这样代码看上去能简洁不少,代码如下
#define MYPROPERTY_NORMAL(type,name,defaultV) Q_PROPERTY(type name READ name WRITE set##name NOTIFY name##Changed)\
public:\
void set##name(const type a) {if(a!=m_##name){m_##name=a;emit name##Changed();}}\
type name() {return m_##name;}\
signals:\
void name##Changed();\
private:\
type m_##name=defaultV;
然后一个属性就能用一个宏直接标识了,如MYPROPERTY_NORMAL(QSting,myname,"sam")
编译的时候发现报错NOTIFY 引用未定义:undefined reference to `MYconfig::mynameChanged()'
经过多次实验,发现是在宏里面包了signals关键字,将signals拿出宏,单独写就不会出问题,如
#define MYPROPERTY_NORMAL(type,name,defaultV) Q_PROPERTY(type name READ name WRITE set##name NOTIFY name##Changed)\
public:\
void set##name(const type a) {if(a!=m_##name){m_##name=a;emit name##Changed();}}\
type name() {return m_##name;}\
private:\
type m_##name=defaultV;
MYPROPERTY_NORMAL(QSting,myname,"sam")
signals:
void mynameChanged();
虽说这样也能让代码简洁不少,但是心中还是有点膈应。
刚开始学习qt,查了各种资料无果,特来这里问下:
1、为什么signals放宏里面会不被识别?
2、有什么办法能让我一句话申明一个属性么?