我的QT Creator学习笔记(十八)——Qt对象模型之属性系统

参考文献:《Qt Creator 快速入门》第三版 霍亚飞编著

Qt提供了强大的基于元对象系统的属性系统,可以在运行Qt平台上支持标准C++编译器。要在一个类中声明属性,该类必须继承自QObject类,而且还要在声明前使用Q_PROPERTY()宏。

这个宏从我个人的理解,比较像C++中的类模板,通过type和name指定属性后,相当于给该类加了一个成员变量,然后后面的就是读这个成员变量的读、写、重置、限制等附加属性。

 Q_PROPERTY(type name
             (READ getFunction [WRITE setFunction] |
              MEMBER memberName [(READ getFunction | WRITE setFunction)])
             [RESET resetFunction]
             [NOTIFY notifySignal]
             [REVISION int]
             [DESIGNABLE bool]
             [SCRIPTABLE bool]
             [STORED bool]
             [USER bool]
             [CONSTANT]
             [FINAL])

type属性类型,

name属性名字,

getFunction读操作函数,,其返回值为前面的type类型,或者该类型的指针或引用。

setFunction可选的写函数

如果没有指定READ函数必须指定MEMBER变量关联

resetFunction重置函数

notifySignal可选的通知信息号。

下面的几个参数一般采用默认,其意义依次是版本、在属性编辑器中是否可见、是否可以被脚本引用、对象状态存储时是否必须存储该属性的值、是否用户可编辑属性、属性值的常量、不能被派生或者重写。

例子,新建myproperty项目应用,基类选择QWidget,其余默认,创建后向项目添加C++类,类名MyClass,基类选择QObject。添加完后在,myclass.h中修改类的定义如下

#ifndef MYCLASS_H
#define MYCLASS_H

#include <QObject>

class MyClass : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString userName READ userName \
               WRITE setUserName NOTIFY userNameChanged)//注册属性username
public:
    explicit MyClass(QObject *parent = 0);
    QString userName() const{return m_userName;}//实现read读函数
    void setUserName(QString userName)//实现wrte写函数
    {
        m_userName=userName;
        emit userNameChanged(m_userName);//当属性值改变时发射信号
    }

signals:
    void userNameChanged(QString);
public slots:
private:
    QString m_userName;
};

#endif // MYCLASS_H

然后在widget.h中添加槽声明

private slots:
    void userChanged(QString);

   在widget.cpp构造函数中,添加以下代码

    MyClass* my=new MyClass(this);
    connect(my,&MyClass::userNameChanged,this,&Widget::userChanged);
    my->setUserName("yafei");//设置属性的值
    qDebug()<<"userName1"<<my->userName();//输出属性的值
    //使用QObject的setPropert函数设置属性的值
    my->setProperty("userName","linux");
    //使用QObject的propert输出属性的值
    qDebug()<<"userName2"<<my->property("userName").toString();
    //添加新的属性
    my->setProperty("myValue",10);
    //使用QObject的propert输出属性的值
    qDebug()<<"myValue"<<my->property("myValue").toInt();
    //添加新的属性
    my->setProperty("test","big");
    //使用QObject的propert输出属性的值
    qDebug()<<"test"<<my->property("test").toString();

 代码中先是对userName进行写入读取,一种方法是直接调用类的相关函数,另一种是setProperty()和property()函数。其效果一样的。

另外setProperty()动态的添加属性,如代码中后面又添加了myValue与test两个属性。这样添加的只对my这个对象有效,对MyClass类的其他对象无效。

实现槽函数

void Widget::userChanged(QString userName)
{
    qDebug()<<"user changed:"<<userName;
}

最终运行效果如下

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值