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

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

Qt提供了灵活的属性系统,它基于Qt的元对象系统,不依赖于编译器,这保证了Qt独立于编译其和平台的特点。这篇文章主要看看如何声明属性。

属性系统比较复杂,先看一个简单的例子。在QWidget中,有很多属性的声明,找一个简单学习:

Q_PROPERTY(boolmodalREADisModal)

这里出现了5个元素:Q_PROPERTY、bool、modal、READ、isModal。这五个元素都是啥作用呢?

Q_PROPERTY:用于声明属性的宏;

bool:属性类型;

modal:属性名称;

READ isModal:这两个元素是一组,放在一起表示读取该属性的接口为isModal。

这个宏声明完成声明属性的工作么?从声明本身来说算是完成了,但是从实现角度看还没有,我们还得将这个属性用到的成员函数实现了。

再看QWidget的代码,有isModal声明也有相关的实现:

声明在qwidget.h中:

public:

boolisModal()const;

实现在qwidget.cpp中:

inlineboolQWidget::isModal()const

{returndata->window_modality!=Qt::NonModal;}

至此,这个属性才算完整。整理一下,Qt只读属性声明的一般形式为:

Q_PROPERTY(type nameREAD getFunction)

其中:

type:必须是C++默认的类型或者自定义类型;

name:是用于自定义;

READ getFunction:getFunction在该类中必须有相应声明和实现。

还是写一个代码,更容易理解:一个简单的类CObj继承QObject,它有一个成员函数isInTest()用于获取测试标志,我们声明一个testflag的属性,代码如下:

声明:

#ifndef COBJ_H

#define COBJ_H

#include<QObject>

classCObj:publicQObject

{

Q_OBJECT

Q_PROPERTY(booltestFlagREADisInTest)

public:

explicitCObj(QObject*parent=0);

signals:

publicslots:

public:

boolisInTest(void)const;

};

#endif//COBJ_H

实现:

#include "cobj.h"

CObj::CObj(QObject *parent) : QObject(parent)

{

}

bool CObj::isInTest(void) const

{

return (true);

}

通过上面的代码的,我们为CObj声明了一个testFlag的属性,testFlag是bool型,testFlag的读函数为isInTest。可以这么说,属性系统是在实现了类的功能之后加进去的,先写好成员函数,然后在加属性,应该是这么一个顺序。

时间: 2024-10-13 11:27:30

[Qt入门篇]5 Qt的属性系统——声明属性的相关文章

[Qt入门篇]6 Qt的属性系统——READ/WRITE/MEMBER

在上一篇文章中,介绍了Qt属性的声明过程,本文主要介绍Q_PROPERTY()中可以使用的关键字. 在Qt5.6中,Q_PROPERTY()总共有12个关键字,本文介绍三个:READ.WRITE和MEMBER.为什么首先这三个?因为一个属性必须有一个读操作,如果没有READ定义,就必须定义MEMBER,否则这个属性无法访问,一个无法访问的属性又有什么意义呢?而WRITE则是与READ相关的操作,它是可选的. READ fun:定义了读取属性的接口fun,fun必须返回属性的类型或者属性同类型引用

[QT入门篇]3 QObject的拷贝构造函数与赋值运算符

本文主要是针对QObject的拷贝构造函数和赋值运算符进行说明.先来看一下拷贝构造函数定义:拷贝构造函数,又称复制构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化.其唯一的形参必须是引用,但并不限制为const,一般普遍的会加上const限制.此函数经常用在函数调用时用户定义类型的值传递及返回.拷贝构造函数要调用基类的拷贝构造函数和成员函数.如果可以的话,它将用常量方式调用,另外,也可以用非常量方式调用. 还记得<[QT入门篇]1 QT中的对象模型>中

Qt入门之常用qt控件认知之QLayout

了解布局,首先得清楚一个概念,就是容器控件.容器控件就是可以容纳别的控件的一种控件,如QWidget,所以就会出现父类控件与子类控件.为了很好的管理这种父子类控件,常用的有几种方法: 第一种就是使用绝对位置,setGeometry定位子类控件相对于父类控件.第二种就是常见的布局. 布局管理,其实就是为容器控件管理子类控件的位置和尺寸,所以布局本身没有存在的意义,其需要和容器控件搭配使用,为容器控件管理子控件服务. 而布局QLayout类其实只是一组预先撰写好的代码,相当于提前写出了以一个控件存放

Qt入门之常用qt控件认知之QLineEdit

QLineEdit是继QLabel和QAbstractButton之后最为常见的输入类编辑控件.顾名思义,其是单行编辑控件,经常用于编辑简短的信息,如用户登录信息及密码输入等.作为编辑框其具有常见的编辑动作,如清除内容clear,复制copy,剪切cut,粘贴paste,重做rudo.撤销undo,全选selectAll及设置编辑信息setText及删除dselete和del及backspace.根据编辑的内容及显示,QLineEdit有不同的显示模式:QLineEdit:::Normal 正常

Qt入门之常用qt控件认知之QLabel

QLabel是Qt最为基本和常用的一个控件.其定义包含在<QLabel>中. 1.整体简介(QLabel功能):QLabel的功能就是显示文字或者图片,没有用户交互功能,这也就是经常不位QLabel控件设置焦点的原因,QLabel外观可以通过不同的方式进行设置,同时有一个非常重要的功能,其可以作为另外一个控件的焦点助记键,即设置QLabel快捷键则将焦点跳到指定的控件,如QLineEdit,此控件通过QLabel的setBuddy函数设置. QLabel可以使用的类型及设置方法: 纯出文本或者

iOS开发——运行时OC篇&amp;使用运行时获取系统的属性:使用自己的手势修改系统自带的手势

使用运行时获取系统的属性:使用自己的手势修改系统自带的手势 有的时候我需要实现一个功能,但是没有想到很好的方法或者想到了方法只是那个方法实现起来太麻烦,一或者确实为了装逼,我们就会想到iOS开发中最牛逼的技术运行时(Runtime) 关于运行时这里就不多说了,请查看笔者之前搬过来了精选文章,这里主要是怎么在实际开发中使用运行时实现我们想要的功能. 比如,在iOS开发中有这样一个问题,关于导航栏中我们点击一个按钮会跳到对应的子控制器,但是这里问题就来了,我们在对应的字控制器中可以点击对应的back

topic4:Qt入门之常用qt控件认知之Button系列

按钮,常常被理解为触发一种动作请求或者命令,是与用户进行指令交互的操作.Qt中Button系列根据用途被划分为不同的定义,其实现框架为QAbstractButton提供按钮的通用性功能,此为抽象基类,所以无法进行实例化.用户需要继承定义此类,实现paintEvent,实现具体的展示.常见的Button有QPushButton,QToolButton,QRadioButton及QCheckBox.这种根据用户分为标记(toggle)的与非toggle的.此种模式用到的典型的c++一种抽象继承模式,

【Qt入门实践】Qt之哲学家问题(linux 多线程)

转载请注明出处:http://blog.csdn.net/feng1790291543 linux多线程实现哲学家问题,依据哲学家吃饭.拿筷子.放下筷子...... 首先,主线程使用Qt下的GUI的简单一个button控制即可了 maindesttop.cpp #include "maindesttop.h" #include "ui_maindesttop.h" QMutex mutex01; QMutex mutex02; QMutex mutex03; QMu

Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析

转载请注明出处:CN_Simo. 题解: 本篇内容主讲Qt应用从创建到发布的整个过程,旨在帮助读者能够快速走进Qt的世界. 本来计划是讲解Qt源码静态编译,如此的话读者可能并不能清楚地知道为何要静态编译,所以借此篇内容说明一下原由并为之后文章的学习做准备. 即使本片内容只是在围绕一个小小的HelloWorld程序开展,但还是希望朋友们不要急于求成,"欲速则不达". 文章整体思路: 我们循序渐进地来看,一个Qt应用的完成有以下一个重要的步骤: 项目创建->源码编译->程序运行