qt属性系统,学到牛牛

得益于Qt反射机制,我们可以获取类对象的成员信息,这其中就包含了属性信息,属性其实就是类中的一种数据成员,不同在于属性需要通过宏定义Q_PROPERTY进行注册,它的使用也必须满足反射机制的条件——类须直接或间接继承QObject且包含Q_OBJECT宏,这样就可以通过元对象的属性类(QMetaProperty)来获取属性相关信息,下面是QMetaProperty的一些常用接口说明:

bool hasNotifySignal() const  //属性是否有关联信号

bool isConstant() const  //属性是否是常量不能更改

bool isDesignable(const QObject *object = nullptr) const //该属性在QDesigner的属性编辑器中是否可见

bool isEnumType() const    //属性是否为枚举类型

bool isFinal() const  //属性FINAL声明是否为true,为true表示该属性不可被重写

bool isFlagType() const    //属性是否为标志枚举类型

bool isReadable() const    //属性是否可读

bool isResettable() const    //属性是否可被重置

bool isScriptable(const QObject *object = nullptr) const  //属性是否可被脚本引擎访问

bool isStored(const QObject *object = nullptr) const  //对象状态保存时是否保存属性值

bool isUser(const QObject *object = nullptr) const    //属性是否可编辑,对应属性的USER声明

bool isValid() const    //属性是否有效

bool isWritable() const    //属性是否可写

const char *name() const    //返回属性的名称

QMetaMethod notifySignal() const   //返回关联了信号的属性的QMetaMethod实例

int notifySignalIndex() const    //返回属性关联通知信号的索引

int propertyIndex() const      //返回属性的索引

QVariant read(const QObject *object) const    //从给定对象object读取属性值

bool reset(QObject *object) const    //重置给定对象object的属性值

int revision() const    //返回属性指定的REVISION

QVariant::Type type() const    //返回属性的类型,具体类型参考QVariant::Type

const char *typeName() const    //返回属性的类型名称

int userType() const  //返回属性的用户类型,返回值是 QMetaType 已注册的值之一

bool write(QObject *object, const QVariant &value) const    //将value作为属性值写入对象object

这些属性信息接口都与注册属性有关,下面是关于属性注册宏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] )

在上述Q_PROPERTY宏定义的语法中,[ ]里的表示可选项,大写字母的选项名(READ)是不能更改的,小写字母除类型(int、bool等直接给定对应类型的值)外部分(type)是自行命名定义的,各选项之间用空格隔开,如:

下面是各选项的含义说明:

type:表示属性类型,需是QVariant支持的类型(具体参考之前QVariant 类的介绍)

name:表示指定属性名称

READ getFunction:其中READ表示可读, getFunction表示读取属性值的函数名,可自行设定

注:若没有指定 MEMBER 变量,则必须指定 READ 函数,而且getFunction通常为const函数,返回值为属性的类型或属性类型的引用

WRITE setFunction :WRITE表示写入, setFunction表示设置属性值函数的名称

注:若属性为只读的则不能指定WRITE属性,setFunction的返回值必须为void且参数只能有一个

MEMBER memberName :MEMBER表示指定成员, memberName表示被指定的类成员变量名称,类成员变量的命名上与属性应该有区分(通常命名规范中类成员变量前应添加m_以表示成员变量而属性无需添加如:成员变量m_value与属性value ),该属性用于设置成员变量memberName具备可读可写性质;注:若没指定READ则必须指定MEMBER

RESET resetFunction :表示重置属性为默认值, resetFunction不能有参数和返回值

NOTIFY notifySignal :表示指定与属性关联的信号notifySignal,即当属性值变化时就会触发信号notifySignal

REVISION int :设置版本号,默认为0

DESIGNABLE bool:表示设置属性在Qt设计师的属性编辑器中是否可见,默认为true(可见)

SCRIPTABLE bool:表示设置属性是否可被脚本引擎访问,默认为true

STORED bool:设置保存对象状态时是否必须保存属性值,多数情况默认为true

USER bool:设置属性是否为可编辑属性,每一个类只能有一个USER属性指定,默认为false

CONSTANT:表示属性值是常量,常量属性不能指定WRITE与NOTIFY选项

FINAL:表示属性不能被子类重写

以上方式设置的是静态属性,在Qt中的类还可以设定动态属性,所谓动态属性就是未使用Q_PROPERTY宏注册而通过调用QObject::setProperty()方法添加的属性。动态属性可通过设置无效的QVariant对象进行删除该动态属性,另外动态属性属于类对象的实例,不满足元对象属性机制,不能使用元对象获取动态属性信息,但可使用QObject::property()进行属性值的获取。

QVariant property(const char *name) const

作用:获取指定名称属性的值,若指定名称的属性不存在则返回无效的QVariant

bool setProperty(const char *name, const QVariant &value)

作用:设置指定名称属性的值,若设置的属性已用Q_PROPERTY在类中注册,且值类型与属性类型兼容(Qt中可自动转换的类型)则设定属性值为value并返回true,若给定值类型不兼容则值设定无效并返回false;若设置的属性未使用宏定义Q_PROPERTY在类中注册,则动态添加指定名称的属性并设置给定值,此时也返回false

使用setProperty和property方法也可以设置和获取静态属性信息,若属性有相关联的读取和写入函数(getFunction与setFunction,通常Qt中属性获取函数的名称定义时前面不添加get),则可使用对应的读写函数进行读取和写入。

文章来源:学到牛牛 www.xuedaon.com

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容