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

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的状态机框架和动画框架依赖属性系统。

中东土豪喜笑颜开!珠海航展合成旅052D打包卖,付款就有战斗力第十四届珠海航展正在火热进行中,到目前为止,中国国内的各大厂家已经在航展的现场上展出了多种武器装备,而珠海航展也不是一般的航空展览会,而是中国少有的堪比国际防务展的多平台武器博览会探访第五届进博会消费品展区参观者正在体验口红产品。殷立勤摄参观者正在了解美妆产品。殷立勤摄雅诗兰黛展台,工作人员正在向参观者介绍最新美妆产品。殷立勤摄参观者了解最新美妆产品。殷立勤摄雅诗兰黛展台,工作人员正1986年,老山战役中,幸存的6名黑豹突击队员,如今过得怎样有人说,中国之所以这么和平,是因为用一百年左右的时间打完了几百年没有打完的仗,的确,自1840年到21世纪初,中国一直处于相对动乱的状态,前不仅有英法的宰割,到后期居然还有日本等国看不出有何不当之处纵观网传李少莉女士在公共场合工作会议上的照片,未曾见其穿着色彩妖艳服饰,亦未有袒胸露背淫秽之举,也无媚态惑众荡妇之形。但见其公众场合工作会议时,身穿公务正装,白衣西裤,西服套裙,应oracle常用命令梳理1打开sqlplus连接suoraclesqlplusnolog2打开数据库connsysassysdbasqlplusassysdba使用syscontext查看属于哪个容器se爱迪特侵权诉讼纠纷仍未解原大股东上市前夕临场退出云创财经文张彦爱迪特(秦皇岛)科技股份有限公司(以下简称爱迪特)主要从事氧化锆瓷块等口腔修复材料的研发生产和销售,是国内领先的口腔修复材料及口腔数字化设备提供商。创业板发审会公告显今天a股缩量收跌,典型的洗盘行情,明天大盘会怎么走?今天a股全天缩量震荡洗盘,自从开盘微涨微跌起盘面表现就非常弱,除了早盘在证券板块异常拉升带动拉升,结果出现冲高回落,始终无法脱离震荡下滑状态,主要是盘面人气低迷,典型的洗盘走势。午地暖杀精还会致癌?它的辐射究竟有多大?央视的一个试验给出答案最近天越来也冷了,地暖逐渐开始被大家利用起来。虽然地暖是十分舒适的供暖方式,但也有人担心,地暖会威胁健康。地暖辐射大,容易致癌地暖是甲醛的加速器,当心得白血病地暖会杀精,男性最好别物流保通保畅11月10日邮政快递揽收量环比增长0。6央广网北京11月11日消息(记者王晶)最新的数据显示,11月10日,全国货运物流有序运行,邮政快递揽收量环比增长0。6。2022年11月10日,河北邯郸,中国邮政集团分公司寄递事业9换1,4换1,1换2!浓眉哥大批交易方案揭晓,詹皇或迎来新三巨头北京时间11月9日,洛杉矶湖人的内讧恐已提前爆发,输给爵士的那场比赛,最后时刻大比分惨败之下,浓眉哥脸上是一片不满和愤怒,身边的詹姆斯和威少竟然在开玩笑。当时双方不光没有任何的交流湖人要趁火打劫?史诗级4换2交易方案,老詹有望联手杜兰特欧文随着新赛季的开始,各支球队也在不断进行的比赛当中逐渐步入正轨。而篮网队这边却是一波未平一波又起,上个赛季他们送走了哈登,换来了不上场打球的西蒙斯,欧文又因为疫苗问题成为兼职球员,最
一树黄花醉人眼来会仙镇岭上村邂逅这片春光人们在欣赏盛开的黄花风铃木。3月21日是二十四节气的春分时节,气候温和阳光明媚,记者驱车沿着良永公路来到临桂区会仙镇岭上村采访。走进岭上村,就被眼前美丽的新农村景象吸引。村里的民房定了!去香港又一路线复运!港府28日起免费送百万份豪礼好消息!好消息!港珠澳大桥澳门口岸往返香港国际机场接驳巴士3月20日起恢复服务。另外,3月26日起将恢复深圳机场直飞台湾桃园机场客运航班。一起来看看详情吧港珠澳大桥澳门口岸往返香港漳州旅游必去的十个景点头条创作挑战赛1云水谣古镇。云水谣古镇在漳州旅游必去十大景点中有着数百年的历史,古镇中各类百年的树木,还有青山碧水,曾经电视取景的点至今也是保存得十分完整的,所以在古镇内能欣赏到的魅族FlymeAuto界面再曝光敏感行为高亮提醒应用权限可一键关闭IT之家3月23日消息,魅族Flyme官方今日曝光了FlymeAuto车机系统的全新界面,称为车主的隐私安全保驾护航。具体来看,魅族FlymeAuto车机系统支持敏感行为全程高亮提数百万年前马的祖先都吃草?中科院团队最新研究突破传统认知中新网北京2月17日电(记者孙自法)数百万年前,地球上的马吃什么怎么吃?它们的食性与其生态环境适应和演化命运有何关联?马科动物前世今生的相关研究长期以来备受关注。从约5600万年前传世手游热血灵兽合击,共创传世辉煌!兄弟们好,本期小编就要为大家带来一款传奇世界的手游推荐,这款游戏最大的特色就是三职业和灵兽骑战,没错这款手游不只有灵兽,他可以和你合作一起战斗,让你的战斗效率和实力大大提升,那么本百亿级私募最新持仓曝光!高毅景林淡水泉重仓股浮出水面作者丨李域杨晶欧子舒编辑丨姜诗蔷图源丨图虫百亿私募作为市场的风向标,持仓动向备受市场关注。随着上市公司陆续披露2022年报,高毅景林淡水泉重阳思勰等多家百亿私募的最新持仓也浮出水面新型诈骗时常上演?别被骗!这里有实用预防技巧!现代社会科技不断进步,人们使用网络和移动设备交流支付购物和娱乐等活动日益普及。但是,随着网络技术的发展,电信网络诈骗也越来越猖獗。犯罪分子的手段和手段也在不断更新和升级。让我们一起曝郭富城亲姐住贫民窟,靠卖废品为生,去年郭富城为岳母购置豪宅3月23日,港媒曝出郭富城亲姐郭凤群近况,不仅生活落魄,甚至连温饱都解决不了,每天靠捡废品为生,而去年亲弟弟郭富城刚在他的豪宅旁边,为岳父岳母购置价值几千万的豪宅,网友留言说毕竟是从显微镜下的大明之丝绢案悟担当近日,电视剧显微镜下的大明之丝绢案热播,引发观众热议。该剧讲述了算学天才帅家默从县衙税簿中意外发现仁华县承担了周围七县此前百余年的丝绢税负,由这一赋税错误开启了拨乱反正之路的故事。三国93杨修聪明绝顶?曹操使出如虎吞狼之计,司马懿却不看好曹操在名胜古迹上,用毛笔写下了一个字,就转身离开了。这让认识这个字的杨修,思考一会就明白了。视频加载中杨修立刻将此门拆掉,门上写一活字,那是阔字,丞相是嫌这个门太宽了。就这样杨修来