在上一篇文章中,介紹了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宏中不能使用逗號(,),只能使用空格。
[Qt入門篇]6 Qt的屬性系統——READ/WRITE/MEMBER
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.