范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Qt属性系统(QtPropertySystem)

  Qt提供了巧妙的属性系统,它与某些编译器支持的属性系统相似。然而,作为平台和编译器无关的库,Qt不能够依赖于那些非标准的编译器特性,比如__property 或者 [property]。Qt的解决方案能够被任何Qt支持的平台下的标准C++编译器支持。它依赖于元对象系统(Meta_Object Sytstem),元对象系统通过信号和槽提供了对象间通讯的机制。 1. Qt中怎么声明属性?
  QObject中的子类的私有域中使用Q_PROPERTY宏来声明一个属性
  以下是来自QWidget类的一些属性声明 Q_PROPERTY(bool focus READ hasFocus) Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled) Q_PROPERTY(QCursor cursor READ cursor WRITE setCursor RESET unsetCursor)   以下例子展示了如何使用MEMBER关键字将类数据成员导出为Qt属性。注,NOTIFY signal必须被指定,这样才能被QML使用 Q_PROPERTY(QColor color MEMBER m_color NOTIFY colorChanged) Q_PROPERTY(qreal spaing MEMBER m_spacing NOTIFY spaingChanged) Q_PROPERTY(QString text MEMBER m_text NOTIFY textChanged) ... signals: void colorChanged(); void spacingChanged(); void textChanged(const QString &netText);   private: QColor  m_color; qreal     m_spacing; QString m_text;2. 对QT中属性的理解
  一个属性的表现就像一个普通的数据成员一样,但是它有额外提供元对象系统访问的特性
  (1)如果MEMBER关键子没有被指定,则一个READ访问函数是必须的,它被用来访问数据成员的值。它的返回类型必须是属性类型或者属性类型的常引用。比如,QWidget::focus是一个只读的属性,通过读函数,QWidget::hadFocus访问。
  (2)一个WRITE函数是可选的,它被用来设置数据成员的值。的返回类型必须是void,而且仅能有一个参数,其类型必须是属性类型或者是属性类型的指针类型或者是属性类型引用。例如,QWidget::enabled有一个WRITE函数,QWidget::setEnabled(bool)。只读属性不需要WRITE函数。比如QWidget::focus就没有WRITE函数。
  (3)如果属性没有READ访问函数,则需要用MEMBER指定成员变量,这使得给定的成员变量在没有创建READ和WRITE的函数下可读可写。如果你需要控制变量的访问权限,也可以使用READ和WRITE函数而不仅仅是MEMBER,注意别同时使用。
  (4)一个RESET函数页是可选的,它被用来将属性设置为上下文指定的默认值,例如,QWidget::cursor有READ和WRITE函数,QWidget::cursor() QWidget::setCursor(),同时它也有一个RESET函数QWidget::unsetCursor(),因为没有可用的setCursor调用可以确定的将cursor属性重置为上下文默认的值。RESET函数必须返回void类型,而且不带参数。
  (5)NOTIFY也是可选的。如果定义了NOTIFY则需要指定一个已经存在的信号,该信号在属性值发生改变是发射。与属性相关的信号必须有一个或者零个参数,而且必须与属性的类型相同。参数为数据成员的新值。NOTIFY信号应该仅仅当属性值真正的发生改变时发出,以避免被QML重新评估。
  (6)REVISION也是可选的,如果包含了该关键字,它定义了该属性和信号被特定版本的API使用通常是QML。如果没有包含该关键字其默认为0。
  (7)DESIGNABLE指定了该属性在GUI编辑器中是否可见(比如QtDesigner)。大多数的属性是可设计的(DESIGNABLE默认为真)。除了true和false,你还可以指定boolean成员函数。
  (8)SCRITABLE属性指定了该属性是否可以被script engine访问,其默认为真。除了true和false你还可以指定boolean函数。
  (9)STORED属性指定了该属性是否是独立的或者是否依赖于别的属性。它也指定了当保存对象属性时是否会保存该属性。大多数的属性的STORED为真。但是,QWidget::minmunWidth()的STROED为false,因为它的值是从QQWidget::minimumSize()中取得的,它的类型是QSize。
  点击领取Qt学习资料+视频教程~
  「链接」
  (10)USER指定了属性是否被设计为用户可见和可编辑的。正常情况下,每一个对象只用一个USER属性(默认为false)。例如,QAbstractButton::clicked对Buttons是可编辑的(checkable)。注,QItemDelegate使用设置和访问函数色设置widget的USER属性。
  (11)CONSTANT的出现表明属性是一个常量值。对于给点的对象实例,每一次READ函数的调用都应该返回相同的值。对于不同的实例该属性可能会不相同。同时不能有WRITE函数和NOTIFY信号。
  (12)FINAL表明该属性不会再子类中被覆盖。在某些情况下它被用来优化性能,但是并没有被moc实现。必须注意,绝不在子类中覆盖FIANL属性。
  (13)READ WRITE RESET函数可以被继承。它们也可以是虚函数。当在使用多继承的类中使用的时候,其必须来自第一个类。
  属性类型可以是任何QVariant支持的属性,或者是用户自定义的属性。在这个例子中,类QDate被看做用户自定义的类型。Q_PROPERTY(QDate data READ getDate WRITE setDate)因为QDate是用户自定义的,当声明属性时,你必须包含头文件。由于历史原因,QMap和QList是QVariantMap和QVariantList的同义词。 3. 使用元对象系统读写属性
  一个属性可以通过QObject::poperty()函数、QObject::setProperty()函数访问和设置。除了属性的名字之外不用知道类的别的信息。在下面的代码段中,调用函数QAbstractButton::setDown()和函数QObject::setProperty()都是设置属性"down" QPushButton* button = new QPushButton; QObject* object = button; button->setDown(true); object->setProperty("down" , true);
  通过WRITE函数设置属性值,比上述两者都好,因为它效率更高而且在编译时期有更好的诊断。但是这需要你在编译实际了解整个类(能够访问其定义)。通过属性名访问属性,能够让你再不了解类的定义的情况访问或者设置属性。你可以在运行时期通过QObject,QMetaObject和QMetaProperties查询类属性。 QObject *object = ... const QMetaObject *metaObject = object->metaObject(); int count = metaObject->propertyCount(); for (int i = 0 ; i< count; ++i) {     QMetaProperty metaProperty = metaObject->property(i);     cont char *name = metaProperty.name();     QVariant value = object->property(name); }
  在上述的代码片段中,QMetaObject::property()被用来获取定义在某个未知的类中的metaData。属性的名称通过metaData获取,并且将其传给QObject::property()来获取属性值。
  假设我们有一个简单的类MyClass,它继承自QObject而且在private域中使用了Q_OBJECT。我们想声明一个属性用于跟踪权限值。该属性的名称是priority,它的类型是定义在MyClass中的Priority枚举。
  点击领取Qt学习资料+视频教程~
  「链接」
  我们使用Q_PROPERTY在private区里声明属性。READ函数是priority(),WRITE函数是setPriority()。枚举类型需要使用Q_ENUM()宏将其注册到Meta-Object System中。注册一个枚举类型使得枚举可以在setPropert函数中使用。我们也必须提供READ和WRITE函数的声明。该类的定义如下: class MyClass : public QObjct {     Q_OBJECT     Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged) public:     explicit MyClass(QObject *parent = 0);     ~MyClass();       enum Priority { High , Low , VeryHigh , VeryLow };     Q_ENUM(Priority)       void setPriority(Priority priority)     {         m_priority = priority;     }       Priority priority() const { return m_priority; }   signals:     void priorityChanged(Priority);   private:     Priority m_priority; };
  READ函数是常成员函数而且返回Priority类型。WRITE函数返回void而且只有一个类型为Priority的参数。
  给定一个指向MyClass实例的类型为MyClass或者QObject的指针,我们有两种方式去设置它的priority属性。 MyClass *myinstance = new MyClass; QObject *object = myinstance;   myinstance->setPriority(MyClass::VeryHigh); object->setProperty("priority" , "VeryHigh");
  在这个例子中,定义在MyClass中的枚举类型是属性的类型,而且被Q_ENUM()宏注册在Meta-Object System中。这使得枚举类型可以在setProperty中通过字符串访问(string),使用在别的类中定义的枚举类型,他必须被完全的声明(i.e. OtherClass::Priority)。而且那个类应该继承自QObject而且使用Q_ENUM()宏注册。
  一个相似的宏Q_FLAG()。就像Q_ENUM()一样,它注册枚举类型,但是将其标记为一系列的flag,即,可以使用或操作。一个IO类有着Read和Write的枚举值,而且之后可以在QObject::setProperty传入Read | Write访问。Q_FLAG()应该被用来注册枚举类型。 4. 动态属性
  QObject::setProperty()也可以被用来在运行时期为类实例添加属性。当传入名称和值调用该函数时。如果属性名称已经在类中存在并且传入的类型与属性的类型兼容,则属性值被保存并且返回真,否则值不会被修改,但是函数返回假。但是如果给定的属性名不存在则新的属性被添加到类中,当函数仍然返回false。这意味着函数的返回值不能用来确定属性值看是否被成功的设定。除非你已经知道属性之前是否存在。
  注:动态属性被添加到每一个实例中。即它们被添加到QObject中而不是QMetaObject中。可以通过传递一个空的QVariant给setProperty函数来移除属性。QVariant的默认构造函数构造一个无效的QVariant对象。
  动态属性可以通过QObject::property()查询,就像Q_PROPERTY定义的属性一样。
  被属性使用的自定义类型需要使用Q_DECLARE_METATYPE宏注册。这样QVariant对象才能够保存该类的值。这个在动态和静态属性都是适用的。
  点击领取Qt学习资料+视频教程~
  「链接」
  为类添加额外的信息与属性系统相对应的是Q_CLASSINFO(name , value)宏。这个宏将添加name-value的到类的元对象中。例如:
  Q_CLASSINFO("Version" , "3.0.0")
  和被使用的元对象数据一样,类信息可以在运行时通过QMetaObject::classInfo函数访问。 附:所谓添加属性到QOject中二不是QMetaObject中的意思是: 假设:有两个MyClass对象的实例a 与 b,当为a动态添加一个属性时,b是不会受到影响的。 QMetaObject是所有的MyClass实例所共享的。 关于Q_DECLARE_METATYPE,另一个重要的用途就是用于注册信号和槽中使用的用户自定类型。 如果信号和槽使用Qt::QueuedConnection连接,则还需要使用qRegisterMetaType()函数注册。 此外,Qt的状态机框架和动画框架依赖属性系统。

中国男乒无人进四强,王皓压力巨大,球迷难怪秦志戬主动下课WTT南非德班挑战赛,随着比赛的进行,1月14日,进行了男单14决赛的较量。而中国男乒这一次全军覆没,再一次被团灭!事实上,在正赛首轮过后,参加男单比赛的六名队员,就有四人遭遇了一中国,河北省,承德市,深山冥想厅大舍建筑在中国河北省承德市滦平县老瓦村的山谷里,大舍建筑建造了一座当代的冥想和自我反思的寺庙。这座建筑是一个石头和混凝土结构,屋顶呈雕塑般的弧形,将光线引入宁静的内部空间。散布在整个项目中恬不知耻,韩国官员称欢迎中国旅客到韩国,中国拒绝!近日,韩国济州岛知事吴怜勋接受采访时表示,期待中国游客早日访问济州。吴怜勋说,济州岛拥有美丽和平的生态环境,是中国游客最喜欢的韩国代表性旅游目的地,期待中国和济州的空中航线早日重开中国芯片为何受制于人?真是他们惹的祸自从特朗普当选美国总统后,开启了对中国高科技企业的打压。重点打压方向就是中国的芯片。中国虽然是制造大国,也拥有全产业链。但是没有荷兰阿斯麦的EUA光刻机。中国也造不出12nm以上的颈椎疼脖子僵,一招就能治,关键还能降血压!随着手机的普及越来越广,低头族的队伍也越来越庞大,越来越多的人出现颈椎不舒服的问题,那么肩颈酸痛时该怎么办呢?往下看!颈椎病的征兆总是莫名其妙频繁落枕,半夜睡觉感觉脖子不舒服,早上3款被捧上天的保健品,实则伤身劳神,不少人上当,建议了解随着现代生活水平不断提升,各年龄段的人们都逐渐开始注重养生。然而在快节奏的时代背景下,人们对于身体的调养也要求更高,于是常常会买一些昂贵的保养品来保养身体,这也就给许多商家提供新的肠道推粪机已公布,香蕉不在列,平时多吃,大肚腩或离你而去肠道被称为人的第二大脑,是因为肠道内的神经系统可以独立完成接收信息以及传递感知的过程,而且还会做出反应,产生感知觉。判断肠道的健康与否,可以通过排便来了解,便秘会对寿命造成一定的影花生会导致肿瘤扩散转移?3种坚果很多人忽略,健康隐患不小很多人喜欢吃花生,营养价值高,富含蛋白质2536,脂肪含量更是达到40,花生当中的维生素铁元素和其他矿物质都是人体所需。花生的脂肪含量占到总营养素的3039,要知道植物性植物当中脂大运会体育公园获得中国建设界奥斯卡大奖1月13日,中国建筑业协会公布20222023年度第一批中国建设工程鲁班奖(国家优质工程)入选名单,成都世界大运会体育公园项目成功入围,荣获中国建设工程鲁班奖。美形成一湖一环七岛十NBA近几年各球队战绩排行一览!数据媒体ExtraStatMuse晒出了两张图片,内容为1819赛季至今,各球队的总战绩排行西部掘金223胜117负,胜率63。7爵士216胜136负,胜率61。4快船208胜14篮网官宣了!双向合同签约1米90后卫,缓解杜兰特受伤压力北京时间1月14日,根据NBA名记Shams消息,篮网用双向合同签下后卫德鲁史密斯。随后篮网官方宣布了这一消息,确定正式签约史密斯,篮网签约目的很明显,就是在杜兰特养伤阶段,有更多
掘金主帅马龙我仿佛看了一部精彩的电影有这样一场比赛是好事直播吧1月16日讯NBA常规赛,掘金119116险胜魔术。掘金主教练马龙赛后接受了采访。我一整晚都坐在板凳席末端,就好像看了一部精彩的电影一样。马龙说道。今晚赛后我跟我的球员们说,你想家,家也想你来源央视新闻你有多久没回过家乡了?提到家乡,你最先想起什么?家乡的记忆像一根隐形的线无论飞得多远都始终在原点牵着你指引你找到回家的方向今天,央视新闻带你回家与那些温暖的地方重逢走遍湖州这个小区交付验房师吃不消了?湖州有个吾悦华府瑞园小区,交付没多久,业主们反映发现了不少问题。有业主说,验房师都有点吃不消了。视频上个月交付的小区验房师有点吃不消?吾悦华府瑞园小区在湖州南浔区,开发商是湖州新城我与妻子回故乡,她教会了三婶化妆,三爷却有些失望七八年之久没回过故乡了,印象中的模样早已检索不到,童年时光也成了片段,曾一起嬉耍过的伙伴名字也忘却了。在外生活时常想起这些,又因各种事由在忙碌,这让我实在有点无法接受。前些日子道路亲爱的,你知道吗?就算你不在我身边,我也爱你亲爱的,你知道吗?就算你不在我身边,我也爱你有一种爱,叫真爱有一种想念,叫梦里梦外都有你。你在远方,也在我的心上,是我此生最深的爱,是我余生最长的思念。远方的某人,心上的你,我爱你溥侗,大清国歌的曲作者,昆乱不挡,六场通透的票界大王爱新觉罗溥侗生于光绪二年,因排行第五,所以内外行皆尊称其为侗五爷,其父亲爱新觉罗载治,乃乾隆皇帝十一子成亲王永瑆的曾孙,世袭镇国将军,辅国公。按辈分算,他是末代皇帝溥仪的族兄,妥妥黄巢兵败姬妾被俘,唐僖宗问为何造反,对方一句话说得他恼羞成怒如果您喜欢这篇文章,请点击右上方的关注。感谢您的支持和鼓励,希望能给您带来舒适的阅读体验。唐末的农民起义中,黄巢的名字是最响亮的。黄巢兵败身死,唐朝军队俘虏了黄巢的十几名姬妾。唐僖伊丽莎白一世三岁母亲被父亲处决,26岁成女王,为何终身未嫁?1603年3月24日伊丽莎白一世在里士满王宫去世,这个统治英格兰近半个世纪,使英格兰成为欧洲最强大的国家之一的人一生经历了什么?为何终身未嫁?大家好,我是大世界小历史,喜欢的朋友记蒙古帝国十大妖将之乌鸦狼人太子太傅忽难我是小树,点击上方关注,每天为您分享精品历史故事与真实历史事件揭秘干货。忽难,格泥格思氏。生于1151年卒于1225年。尼伦蒙古人(尼伦者为血统纯洁的蒙古人之意)。忽难世代为格泥格中国紫禁城600岁背后,10。1级地震也屹立不倒都说不到长城非好汉,其实每一个黄皮肤黑头发的中国人,都应该去紫禁城里走一走,才算此生无憾。循着朱红色的围墙,走过明黄的琉璃瓦,穿过微翘的层层重檐,轻抚斑驳厚重的城门,这里尽是讲不完东北大学Science发文!超高强钢领域实现新突破东大Science发文Ductile2GPasteelswithhierarchicalsubstructure2023年1月13日,东北大学轧制技术及连轧自动化国家重点实验室王国