Qt中Q_PROPERTY定义属性以及属性的使用

Posted Cloud_Castle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt中Q_PROPERTY定义属性以及属性的使用相关的知识,希望对你有一定的参考价值。

[cpp]  view plain copy
  1. Q_PROPERTY(type name   
  2. READ  getFunction  //属性名  
  3. [WRITE setFunction] //读函数  
  4. [RESET resetFunction]        
  5. [NOTIFY notifySignal]   
  6. [DESIGNABLE bool]   
  7. [SCRIPTABLE bool]   
  8. [STORED bool]   
  9. [USER bool]   
  10. [CONSTANT]   
  11. [FINAL])   

其实不知道这个定义中属性name是干什么的,网上搜的都说是注册到元对象系统中,使用setProperty能够直接访问name,然后通常在类的私有成员里再定义一个m_name,用getFunction读m_name,用setFunction设置m_name,那这样子跟name有什么关系。

我是这样理解的,Q_PROPERTY只是一个声明,与name相关的是get/set这组函数,name虽然能在designer中直接使用,但还是通过get/set来实现的,其实name的值就是读函数get的返回值,不知道这样理解对不对,暂时这么理解,回头整理好了思路或者有更好的想法再来完善

   上面说的类中定义的一个数据成员m_name,其实这个变量跟Q_PROPERTY定义的name没什么关系,name的值就是你read函数中的值,如果你在read函数关联了变量m_name,当然就name就与m_name有关系,如果没关联,当然也就没关系

   在学习的过程中,一直找不到notify这个signal是在哪里发射的,学习了很久才发现自己一直都被绕进去了,现在终于想通了,这个signal的发射也是手动添加的,一般来说是在setFunction中发射的。

   原来,getFunction/setFunction/notifySignal都是本来已经存在的东西也就是说是你自己在类里边定义的东西,Q_PROPERTY只是将他们注册到元对象系统中,并且起了个名字叫name,使之能够使用元对象系统操作name,包括在designer中,qml中,都可以直接用name这个属性,但是在C++中的读写只能使用get/set了

以上是关于Qt中Q_PROPERTY定义属性以及属性的使用的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Qt 属性与自定义类一起使用?

在没有 Q_PROPERTY 定义的情况下从 C++ 访问 QML 对象的属性

[Qt入门篇]5 Qt的属性系统——声明属性

Qt编写控件属性设计器12-用户属性

Qt:如何在 C++ 端而不是 QML 上监视 Q_PROPERTY 更改

为啥我不能拥有带有此签名的 Q_PROPERTY?