QT提供了一个成熟的属性系统,但是作为一个跨平台的且与编译器无关的库,qt不依赖于非标准的编译器功能例如 __property or [property];

QT的强大之处在于它可以支持任何标准的c++编译器。 QT是基于 Meta-Object System(元对象)和signals and slots(信号槽)的。

Q_PROPERTY

Q_PROPERTY()是一个宏,用来在一个类中声明一个属性property,由于该宏是qt特有的,需要用moc进行编译,故必须继承于QObject类。

Q_PROPERTY(type name READ getFunction [WRITE setFunction] [RESET resetFunction] [NOTIFY notifySignal] [DESIGNABLE bool] [SCRIPTABLE bool] [STORED bool] [USER bool] [CONSTANT] [FINAL])  

可能还不太好理解 不过下面介绍几个特殊的例子你就豁然开朗了。

  1. Q_PROPERTY(bool focus READ hasFocus)

  2. Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)

  3. Q_PROPERTY(QString title READ title WRITE setTitle USER true)

一个属性行为类似于类里面的数据成员,但是他是却可以通过Meta-Object System来访问。 在外界看来,property跟类中数据成员没有什么区别,但是还是有几点不一样,参考qt文档,主要有以下几点:

1.必须有一个read函数。它用来读取属性值。因此用Const限定。它的返回值类型必须为属性类型或者属性类型的引用或者指针。不能是其他类型例如:QWidget::hasFocus().

2.有一个可选的write函数。它用来设置属性值,它的返回值必须为void型,而起必须要含有一个参数。例如:QWidget::setEnabled()

3.一个reset函数能够把property设置成其默认状态,它也是可选的。复位功能必须返回void,并且不带参数,

4.一个NOTIFY信号是可选的 。如果定义,它提供了一个信号这个信号在值发生改变时会自动被触发。

5.如果定义了"STODE"属性表明这是一直存在的。QWidget::minimumSize() 6.一个"DESIGNABLE"属性表明该property能在GUI builder(一般为Qt Designer)可见

7.USER 属性 表面是否可以被用户所编辑

8 CONST设定属性是不可修改的 所以不能跟WRITE或者NOTIFY同时出现

9 FINAL表明该属性不会被派生类中重写

然后对照这些,自己写了一个例子:

class Test : public QObject {Q_OBJECTQ_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)public:Test(QObject *parent = 0) : QObject(parent) {}virtual ~Test(){}void setEnabled(bool e) { enabled = e; }bool isEnabled() const { return enabled; }private:bool enabled;};

然后在主函数中添加:


Test *test = new Test;test->setProperty("enabled", true);//test->setEnabled(true);        //ok also workif(test->property("enabled").toBool()) .....

如果你不用QML,不用QtScript,不用于创建Designer插件,不使用QItemDelegate,不使用ActiveQt,不使用...... 的话,那么Q_PROPERTY确实没用。

Qt工作笔记-Qt之自定义属性Q_PROPERTY相关推荐

  1. Qt工作笔记-Qt元对象系统解析【2合1】

    博文转载地址: https://blog.csdn.net/spwper/article/details/51332187 说Qt信号与槽是一个很好机制,不如说Qt的元对象系统很强大.这也是大家讲Qt ...

  2. Qt工作笔记-Qt连接Mysql数据库,检索及修改表数据

    目录 原理 演示及现象 原理 因为要对数据库进行操作,然后用某个程序看现象,如果有一个进程,能对指定表中的所有数据进行批量修改,那么看现象将会多么的明显啊! 个人感觉实现这种功能大体有两种思路,一个是 ...

  3. Qt工作笔记-Qt移植到Linux上时提升窗口部件大小写问题(VS上存在的问题)

    目录 理论 模拟问题 理论 在Windows里面那些.h文件是不区分大小写的,但在Linux上是区分大小写的,这也就是为什么用VS去创建一个类的时候,这个类的类名会和.h文件一样,而用Qt Creat ...

  4. Qt工作笔记-Qt生成dll或so,并且调用(含Liunx端与Windows端)

    目录 共享库生成 Linux端编译及调用 Windows端编译及调用 共享库生成 注意:编译的时候要用lib,相当于列表,关联dll中的函数! 这里首先用Qt Creator 新建一个共享库 如下图: ...

  5. Qt工作笔记-Qt文档笔记-QPainter::drawText写文本并且居中

    官方解析 画给定的text并且从指定的position. 这个函数不能处理换行符号(\n),不能将文本分割成多行,也不能分行展示.使用QPainer::drawText()的重载函数可以绘制一个多边形 ...

  6. Qt工作笔记-Qt奇淫技巧把ToolBar改成标题栏

    运行截图如下: 这个是工具栏被改造成了标题栏,放大的时候,他也能正常显示. 1.获取屏幕分辨率: 2.重写QToolBar: 3.自定义Label,用于鼠标移动上去造成不同的效果: 关键源码如下: 1 ...

  7. Qt工作笔记-Qt creator如何生成dll,以及如何移植到vs上

    首先用Qt Creator创建一个库项目: 在类中添加一个add函数,并实现他: 直接就可以生成为一个dll 因为是使用MinGW的编译器所以会有.a文件: 把程序移动过去! 接着用另外一个项目进行调 ...

  8. Qt工作笔记-Qt仿大佬使用关键字(Q_DECL_OVERRIDE与override)

    今天看到某大佬的源码里面用了这个 Q_DECL_OVERRIDE 在虚函数屁股后面写了这个! 这难道是脱裤子打屁吗? 对此查了下,文档如下: 这玩意和override一样,为了防止写错(在使用Qt C ...

  9. Qt工作笔记-Qt文档阅读笔记-qualifiedName()的官方解析及XML使用名称空间

    目录 官方解析 博主例子 官方解析 QXmlStreamReader::qualifiedName() 返回StartElement或EndElement的限制名: 限制名是XML数据中元素的原始名称 ...

最新文章

  1. Java正则入门(1)——去除字符串头尾空格
  2. 《2020城市大脑全球标准研究报告》全文正式开放申领
  3. Shell脚本之条件判断
  4. 一个“alert” 引发的血案
  5. npm install引起的项目崩溃(This is probably not a problem with npm,there is likely additional logging outp)
  6. 安卓系统应用启动流程分析
  7. 定时器控件 Timer 1130
  8. 03数据库的基本查询
  9. Kafka模拟实现(用于自我测试环境)
  10. 世界是数字的读后感:
  11. status函数python_python之路-函数
  12. python 3.6 pyltp 安装
  13. WebSocket多人聊天室
  14. 电脑BIOS为UEFI BIOS,出现蓝屏情况“你的设备遇到问题,需要重启。我们只收集某些错误信息,然后你可以重新启动。100%完成“,解决方法。
  15. 神之bug 嵌套RecyclerView谜之滚动
  16. java 模板模式_java设计模式之模板方法模式详解
  17. ORA-12514: TNS:listener does not currently know of service requested in connect descript
  18. 刚刚!霍金向北京喊话:人类需要大胆前行,涉足无前人所及之处
  19. 2023年闷声发大财的6个风口行业
  20. 如何计算EEG信号的香农熵Shannon entropy(附Matlab程序)

热门文章

  1. c# winform TreeView与ListView的项互相拖动的应用[转载]
  2. Object类的用法(一)
  3. CIO必看:7个常见但一定要避免的数据治理错误
  4. “不翻身,就要翻船”!帆软独家:制造业数字化转型解决方案
  5. 【转载】C++中cin、cin.get()、cin.getline()、getline()、gets()函数详解
  6. 就要有鹤立鸡群的HTML5资本
  7. Python3基本数据类型快速入门
  8. 计算机文档用什么翻译,Word文档翻译在哪里(适于Word2010-Word2016)?
  9. mysql 一对多 join_Mysql中FIND_IN_SET与JOIN在一对多关系查询时的优劣
  10. 决策树算法学习笔记(提升篇)