您的位置:首页 > 编程语言 > Qt开发

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

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

属性系统比较复杂,先看一个简单的例子。在QWidget中,有很多属性的声明,找一个简单学习:
Q_PROPERTY(bool modal READ isModal)
这里出现了5个元素:Q_PROPERTY、bool、modal、READ、isModal。这五个元素都是啥作用呢?
Q_PROPERTY:用于声明属性的宏;
bool:属性类型;
modal:属性名称;
READ isModal:这两个元素是一组,放在一起表示读取该属性的接口为isModal。
这个宏声明完成声明属性的工作么?从声明本身来说算是完成了,但是从实现角度看还没有,我们还得将这个属性用到的成员函数实现了。
再看QWidget的代码,有isModal声明也有相关的实现:

声明在qwidget.h中:
public:
bool isModal() const;
实现在qwidget.cpp中:
inline bool QWidget::isModal() const
{ return data->window_modality != Qt::NonModal; }
至此,这个属性才算完整。整理一下,Qt只读属性声明的一般形式为:
Q_PROPERTY(type name READ getFunction)
其中:
type:必须是C++默认的类型或者自定义类型;
name:是用于自定义;
READ getFunction:getFunction在该类中必须有相应声明和实现,它的返回值必须是type类型或者是type的引用,而且不带参数。
还是写一个代码,更容易理解:一个简单的类CObj继承QObject,它有一个成员函数isInTestine()用于获取测试标志,我们声明一个testflag的属性,代码如下:
声明:

#ifndef COBJ_H
#define COBJ_H
#include <QObject>
class CObj : public QObject
{
    Q_OBJECT
    Q_PROPERTY(bool testFlag READ isInTest)
public:
    explicit CObj(QObject *parent = 0);
signals:
public slots:
public:
    bool isInTest(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。可以这么说,属性系统是在实现了类的功能之后加进去的,先写好成员函数,然后在加属性,应该是这么一个顺序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Q_PROPERTY 属性系统 Qt