我吃牛肉面 2021-10-20 11:33 采纳率: 0%
浏览 12
已结题

QT中不能用宏包装signals:关键字

在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、有什么办法能让我一句话申明一个属性么?

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 10月28日
    • 创建了问题 10月20日

    悬赏问题

    • ¥15 Opencv配置出错
    • ¥15 模电中二极管,三极管和电容的应用
    • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
    • ¥15 气象网格数据与卫星轨道数据如何匹配
    • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
    • ¥15 微软账户问题不小心注销了好像
    • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
    • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
    • ¥20 关于web前端如何播放二次加密m3u8视频的问题
    • ¥15 使用百度地图api 位置函数报错?