[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必須返回屬性的類型或者屬性同類型引用;fun不能帶參數。

WRITE fun:定義了設置屬相的接口fun,fun沒有返回值,必須帶有一個參數,傳值或者傳引用,參數類型與屬相類型相同。

MEMBER var:MEMBER指明瞭成員變量var即可讀也可寫的,相當於同時使用了READ和WRITE關鍵字。不定義READ,那麼必須定義MEMBER;定義了MEMBER,仍可以使用READ或者WRITE控制訪問接口。

我們可以換種思路來理解READ、WRITE和MEMBER三個關鍵字:屬性類似與成員變量,我們要修改成員變量時有兩種方法,一種是通過類的接口,一種是通過類的對象直接訪問。READ和WRITE就是第一種方法,二者定義讀寫屬性(成員變量)的接口,而MEMBER這是第二種方法,直接對成員變量的操作。

還是舉例說明以加深理解。

聲明文件如下:

#ifndef COBJ_H

#define COBJ_H

 

#include <QObject>

 

class CObj : public QObject

{

    Q_OBJECT

    // READ

    Q_PROPERTY(bool p1 READ isInTest)

    // READ和WRITE

    Q_PROPERTY(bool p2 READ isInTest WRITE SetTest)

    // MEMBER

    Q_PROPERTY(bool p3 MEMBER m_bflag)

    // READ、WRITE和MEMBER

    Q_PROPERTY(bool p4 MEMBER m_bflag READ isInTest WRITE SetTest)

    // READ和MEMBER

    Q_PROPERTY(bool p5 MEMBER m_bflag READ isInTest)

    // WRITE和MEMBER

Q_PROPERTY(bool p6 MEMBER m_bflag WRITE SetTest)

 

public:

    explicit CObj(QObject *parent = 0);

 

signals:

 

public slots:

 

public:

    bool isInTest(void) const;

    void SetTest(bool bflag);

 

private:

    bool m_bflag;

};

 

#endif // COBJ_H

實現文件如下

#include "cobj.h"

 

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

{

 

}

 

bool CObj::isInTest(void) const

{

    return (true);

}

 

void CObj::SetTest(bool bflag)

{

    m_bflag = bflag;

}

CObj類繼承了QObject,我們在CObj中定義了6個屬性,p1到p6,分別描述READ、WRITE和MEMBER的使用組合,p1使用了READ,p2使用READ和WRITE關鍵字,p3使用MEMBER關鍵字,p4使用READ、WRITE和MEMBER關鍵字,p5使用了READ和MEMBER關鍵字,p6使用了WRITE和MEMBER關鍵字。

看了上述幾個屬性讀寫方法,總結一下:

1 Q_PROPERTY定義的屬性必須要有一個讀方法,不能獲取到的屬性是沒有意義的(不能讀的屬性不是好屬性);

2 定義屬性讀方法關鍵字有兩個:READ和MEMBER,READ定義讀取屬性的成員函數(接口),MEMBER定義屬性關聯的成員變量;

3 WRITE定義寫屬性接口,它不是必須的;

4 Q_PROPERTY宏中不能使用逗號(,),只能使用空格。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章