您好,登錄后才能下訂單哦!
Qt提供了靈活的屬性系統(tǒng),它基于Qt的元對象系統(tǒng),不依賴于編譯器,這保證了Qt獨(dú)立于編譯其和平臺的特點(diǎn)。這篇文章主要看看如何聲明屬性。
屬性系統(tǒng)比較復(fù)雜,先看一個簡單的例子。在QWidget中,有很多屬性的聲明,找一個簡單學(xué)習(xí):
Q_PROPERTY(bool modal READ isModal)
這里出現(xiàn)了5個元素:Q_PROPERTY、bool、modal、READ、isModal。這五個元素都是啥作用呢?
Q_PROPERTY:用于聲明屬性的宏;
bool:屬性類型;
modal:屬性名稱;
READ isModal:這兩個元素是一組,放在一起表示讀取該屬性的接口為isModal。
這個宏聲明完成聲明屬性的工作么?從聲明本身來說算是完成了,但是從實(shí)現(xiàn)角度看還沒有,我們還得將這個屬性用到的成員函數(shù)實(shí)現(xiàn)了。
再看QWidget的代碼,有isModal聲明也有相關(guān)的實(shí)現(xiàn):
聲明在qwidget.h中:
public:
bool isModal() const;
實(shí)現(xiàn)在qwidget.cpp中:
inline bool QWidget::isModal() const
{return data->window_modality!=Qt::NonModal;}
至此,這個屬性才算完整。整理一下,Qt只讀屬性聲明的一般形式為:
Q_PROPERTY(type nameREAD getFunction)
其中:
type:必須是C++默認(rèn)的類型或者自定義類型;
name:是用于自定義;
READ getFunction:getFunction在該類中必須有相應(yīng)聲明和實(shí)現(xiàn),它的返回值必須是type類型或者是type的引用,而且不帶參數(shù)。
還是寫一個代碼,更容易理解:一個簡單的類CObj繼承QObject,它有一個成員函數(shù)isInTest()用于獲取測試標(biāo)志,我們聲明一個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:
publicslots:
public:
bool isInTest(void) const;
};
#endif//COBJ_H
實(shí)現(xiàn):
#include "cobj.h"
CObj::CObj(QObject *parent) : QObject(parent)
{
}
bool CObj::isInTest(void) const
{
return (true);
}
通過上面的代碼的,我們?yōu)镃Obj聲明了一個testFlag的屬性,testFlag是bool型,testFlag的讀函數(shù)為isInTest??梢赃@么說,屬性系統(tǒng)是在實(shí)現(xiàn)了類的功能之后加進(jìn)去的,先寫好成員函數(shù),然后在加屬性,應(yīng)該是這么一個順序。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。