前言
学习自:Qt Creator 快速入门第三版 霍亚飞 编著
Qt提供了强大的基于元对象系统的属性系统。
要在一个类中声明属性,该类必须继承自QObject类
过程
新建Widgets应用后,向项目中添加新C++类,类名为MyClass,基类选择QObject。
在myclass.h中,声明前使用:Q-PROPERTY()宏,向原对象系统注册属性userName.
Q_OBJECT
Q_PROPERTY(QString userName READ getUserName WRITE setUserName
NOTIFY userNameChanged) //注册属性userName
public:
explicit MyClass(QObject *parent = nullptr);
QString getUserName() const //实现READ读函数
{return m_userName;}
void setUserName(QString userName)
{
m_userName = userName;
emit userNameChanged(userName); //当属性值改变时发射该信号
}
signals:
void userNameChanged(QString); //声明NOTIFY通知消息
public slots:
private:
QString m_userName; //私有变量,存放userName属性的值
在widget.h中,添加属性改变时的槽声明:
private slots:
void userChanged(QString);
在widget.cpp中,添加头文件
#include "myclass.h"
#include <QDebug>
在构造函数中,创建MyClass类实例
MyClass *my = new MyClass(this); //创建MyClass类实例
进行userName属性的写入和读取,两种方法
一种是:信号和槽函数的跳转,然后直接调用该属性的相关函数
connect(my, &MyClass::userNameChanged, this, &Widget::userChanged);
my->setUserName("yafei"); //设置属性的值
qDebug() <<"userName1:"<< my->getUserName(); //输出属性的值
相关函数
void Widget::userChanged(QString userName)
{
qDebug() <<"user changed:" << userName;
}
第二种方法:使用QObject类的setProperty()函数和property()函数(使用这两个函数要指定属性名)。
//使用QObject类的setProperty()函数设置属性的值
my->setProperty("userName", "linux");
//输出属性的值,这里使用了QObject类的property()函数,他返回值类型为QVariant
qDebug() << "userName2:"<<my->property("userName").toString();
setProperty()函数还可以设置动态属性,将属性名设置为一个类中没有的属性,
例如:在MyClass类外添加动态属性"my Value",在构造函数中:
my->setProperty("myValue", 10); //动态属性,只对该实例有效
qDebug()<<"myValue:"<<my->property("myValue").toInt();
这样添加的动态属性只对类实例my有效,对MyClass类中的其他对象没有作用。
运行结果