简述
Qt自身包含有一个属性系统,可以通过继承QObject的类中去使用Q_PROPERTY()宏、并设置需要绑定的属性与其对应的值来实现一个属性系统。
而Q_PROPERTY()宏中可以声明的内容如下:
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])
READ标记: 如果没有为属性标记MEMBER标记,则READ标记必不可少。声明一个读取属性的函数。
WRITE标记: 可选配置。声明一个可选属性的函数,它指定的函数只能有一个参数,返回值必须为void。
MEMBER标记: 如果你没有为属性指定READ函数就必须为其关联一个成员变量,这样的话这个成员变量不用指定READ/WRITE函数就可以读写。当然,如果你想控制其读写,也可以指定READ/WRITE函数。
RESET标记: 可选配置。这个函数设定的目的是为了让一个属性回滚到与其上下文匹配的默认值。
NOTIFY标记: 可选配置。给属性关联一个信号(该信号必须是已在类中声明过的),当属性的值发生变化时就会触发该信号。为MEMBER变量指定的NOTIFY信号最多只能有一个参数,而且其类型必须与属性的类型一致。当信号出发时,它的值就是属性的值。
REVISON标记: 可选配置。这个标记通常是将属性导出到QML中使用时指定的,它指定了属性适用的API版本。默认值为0。
DESIGNABLE标记: 可选配置。用来说明一个属性是否可被Qt Designer使用,默认值为true。你也可以使用一个返回布尔值的成员函数代替true或false。
SCRIPTABLE标记: 可选配置。用来说明一个属性是否可以被脚本引擎访问,默认值为true。
STORED标记: 可选配置。表明一个属性是独立存在的,还是从其他属性值衍生出来的。默认值为true。
USER标记: 可选配置。表明一个属性是否设计为面向用户的或者用户可编辑的。一般一个类只能有一个USER标记为true的属性,默认为false。
CONSTANT标记: 可选配置。表明一个属性为常量。一个标明为常量的属性不能有WRITE函数和NITIFY信号。
FINAL标记: 可选配置。标明一个属性不能被派生类修改。moc工具不会检查一个FINAL标记为true的属性是否被派生类修改,因此实现者要自己小心注意别在派生类中修改它。
链接: [https://blog.csdn.net/douzhq/article/details/80214142]
其具体格式如下所示:
class CProperty : public QObject
{
Q_OBJECT
Q_PROPERTY(QString m_str READ getstr WRITE setstr)
Q_PROPERTY(int m_num READ getnum WRITE setnum)
public:
explicit CProperty(QObject *parent = nullptr);
public:
QString getstr()const;
void setstr(QString s);
int getnum()const;
void setnum(int i);
private:
QString m_str;
int m_num;
QString CProperty::getstr() const
{
return m_str;
}
void CProperty::setstr(QString s)
{
m_str = s;
}
int CProperty::getnum() const
{
return m_num;
}
void CProperty::setnum(int i)
{
m_num = i;
}
首先先在头文件中声明宏Q_PROPERTY,声明变量和函数,再在.c文件中定义读写函数。
而若要设置属性的值则可以使用setProperty(“属性”,值),或直接调用函数setxxx(),如setnum(int i)去赋值。
而如想要获取属性的值则可以使用property(“属性”),或直接调用函数getxxx()
如getnum().
具体操作如下:
在构造函数中先设置属性的值,再在其他函数去打印出该属性的值:
CProperty::CProperty(QObject *parent) : QObject(parent)
{
this->setProperty("m_str","Property");
this->setnum(567);
getProperty();
}
void CProperty::getProperty()
{
qDebug()<<property("m_str").toString();
qDebug()<<getnum();
}
结果如图: