qt属性系统简介( Q_PROPERTY)

1、属性定义

    Qt 提供一个 Q_PROPERTY()宏可以定义属性,它也是基于元对象系统实现的。Qt 的属性系统与C++编译器无关,可以用任何标准的 C++编译器编译定义了属性的 Qt C++程序。

在QObiect 的子类中,用宏Q_PROPERTY()定义属性,其使用格式如下:

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

Q_PROPERTY宏定义一个返回值类型为 type,名称为 name 的属性,用 READ、WRITE 关键字定义属性的读取、写入函数,还有其他的一些关键字定义属性的一些操作特性。属性的类型可以是 QVariant 支持的任何类型,也可以用户自定义类型。

Q_PROPERTY 宏定义属性的一些主要关键字的意义如下:
1)READ 指定一个读取属性值的函数,没有 MEMBER 关键字时必须设置 READ。

2)WRITE 指定一个设定属性值的函数,只读属性没有 WRITE 设置。

3)MEMBER 指定一个成员变量与属性关联,成为可读可写的属性,无需再设置 READ 和WRITE

4)RESET 是可选的,用于指定一个设置属性缺省值的函数。

5)NOTIFY 是可选的,用于设置一个信号,当属性值变化时发射此信号。

6)DESIGNABLE 表示属性是否在 Qt Designer 里可见,缺省为 true。

7)CONSTANT 表示属性值是一个常数,对于一个对象实例,READ 指定的函数返回值是常数,但是每个实例的返回值可以不一样。具有 CONSTANT 关键字的属性不能有 WRITE和 NOTIFY关键字。

8)FINAL 表示所定义的属性不能被子类重载。

QWidget 类定义属性的一些例子如下:

O_PROPERTY(bool focus READ hasFocus)
O_PROPERTY(bool enabled READ isEnabled WRITE  setEnabled)
Q_PROPERTY(OCursor cursor READ cursor WRITE setCursor RESET unsetCursor)


2.属性的使用

不管是否用READ和WRITE定义了接口函数,只要知道属性名称,就可以通过QObject:property()读取属性值,并通过 QObject::setProperty0设置属性值。例如:

QPushButton *button = new QPushButton;
QObject *object = button;
object->setProperty("flat", true);
boo1 isFlat= object->property("flat");

3.动态属性

QObject::setProperty()函数可以在运行时为类定义一个新的属性,称之为动态属性。动态属性是针对类的实例定义的。

动态属性可以使用QObject:property()查询,就如在类定义里用Q_PROPERTY宏定义的属性一样。

例如,在数据表编辑界面上,一些字段是必填字段,就可以在初始化界面时为这些字段的关联显示组件定义一个新的required 属性,并设置值为“true”,如:

editName->setProperty("required","true");
comboSex->setProperty("required",“true");
checkAgree->setProperty("required","true");

然后,可以应用下面的样式定义将这种必填字段的背景颜色设置为亮绿色。

*[required="true"] (background-color: lime]

4.类的附加信息

属性系统还有一个宏Q_CLASSINFO(),可以为类的元对象定义“名称--值”信息,如:

class QMyClass : public QObject
{
Q_OBJECT
Q_CLASSINFO("author""Wang")
Q_CLASSINFO("company","UPC")
Q_CLASSINFO("version","3.0.1")
public:
...
}

用Q_CLASSINFO()宏定义附加类信息后,可以通过元对象的一些函数获取类的附加信息,如classInfo(int)获取某个附加信息,函数原型定义如下:
OMetaClassInfo OMetaObject::classInfo(int index) const

返回值是QMetaClassInfo 类型,有 name()和 value()两个函数可获得类附加信息的名称和值.

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木士易

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值