参考文献:《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;
}
最终运行效果如下