得益于Qt反射機(jī)制,我們可以獲取類對象的成員信息蚓胸,這其中就包含了屬性信息挣饥,屬性其實(shí)就是類中的一種數(shù)據(jù)成員,不同在于屬性需要通過宏定義Q_PROPERTY進(jìn)行注冊沛膳,它的使用也必須滿足反射機(jī)制的條件——類須直接或間接繼承QObject且包含Q_OBJECT宏扔枫,這樣就可以通過元對象的屬性類(QMetaProperty)來獲取屬性相關(guān)信息,下面是QMetaProperty的一些常用接口說明:
bool hasNotifySignal() const? //屬性是否有關(guān)聯(lián)信號
bool isConstant() const? //屬性是否是常量不能更改
bool isDesignable(const QObject *object = nullptr) const //該屬性在QDesigner的屬性編輯器中是否可見
bool isEnumType() const? ? //屬性是否為枚舉類型
bool isFinal() const? //屬性FINAL聲明是否為true锹安,為true表示該屬性不可被重寫
bool isFlagType() const? ? //屬性是否為標(biāo)志枚舉類型
bool isReadable() const? ? //屬性是否可讀
bool isResettable() const? ? //屬性是否可被重置
bool isScriptable(const QObject *object = nullptr) const? //屬性是否可被腳本引擎訪問
bool isStored(const QObject *object = nullptr) const? //對象狀態(tài)保存時是否保存屬性值
bool isUser(const QObject *object = nullptr) const? ? //屬性是否可編輯短荐,對應(yīng)屬性的USER聲明
bool isValid() const? ? //屬性是否有效
bool isWritable() const? ? //屬性是否可寫
const char *name() const? ? //返回屬性的名稱
QMetaMethod notifySignal() const ? //返回關(guān)聯(lián)了信號的屬性的QMetaMethod實(shí)例
int notifySignalIndex() const? ? //返回屬性關(guān)聯(lián)通知信號的索引
int propertyIndex() const? ? ? //返回屬性的索引
QVariant read(const QObject *object) const? ? //從給定對象object讀取屬性值
bool reset(QObject *object) const? ? //重置給定對象object的屬性值
int revision() const? ? //返回屬性指定的REVISION
QVariant::Type type() const? ? //返回屬性的類型,具體類型參考QVariant::Type
const char *typeName() const? ? //返回屬性的類型名稱
int userType() const? //返回屬性的用戶類型叹哭,返回值是 QMetaType 已注冊的值之一
bool write(QObject *object, const QVariant &value) const? ? //將value作為屬性值寫入對象object
這些屬性信息接口都與注冊屬性有關(guān)忍宋,下面是關(guān)于屬性注冊宏Q_PROPERTY的介紹,Q_PROPERTY宏的使用語法如下:
Q_PROPERTY ( type name
? ? ? ? ? ? ( READ getFunction [WRITE setFunction] | MEMBER memberName
[(READ getFunction | WRITE setFunction)] )
? ? ? ? ? ? [RESET resetFunction]
? ? ? ? ? ? [NOTIFY notifySignal]
? ? ? ? ? ? [REVISION int]
? ? ? ? ? ? [DESIGNABLE bool]
? ? ? ? ? ? [SCRIPTABLE bool]
? ? ? ? ? ? [STORED bool]
? ? ? ? ? ? [USER bool]
? ? ? ? ? ? [CONSTANT]
? ? ? ? ? ? [FINAL] )
在上述Q_PROPERTY宏定義的語法中话速,[ ]里的表示可選項(xiàng)讶踪,大寫字母的選項(xiàng)名(READ)是不能更改的,小寫字母除類型(int泊交、bool等直接給定對應(yīng)類型的值)外部分(type)是自行命名定義的,各選項(xiàng)之間用空格隔開柱查,如:
下面是各選項(xiàng)的含義說明:
?type:表示屬性類型廓俭,需是QVariant支持的類型(具體參考之前QVariant 類的介紹)
?name:表示指定屬性名稱
?READ getFunction:其中READ表示可讀, getFunction表示讀取屬性值的函數(shù)名唉工,可自行設(shè)定
注:若沒有指定 MEMBER 變量研乒,則必須指定 READ 函數(shù),而且getFunction通常為const函數(shù)淋硝,返回值為屬性的類型或?qū)傩灶愋偷囊?/p>
?WRITE setFunction :WRITE表示寫入雹熬, setFunction表示設(shè)置屬性值函數(shù)的名稱
注:若屬性為只讀的則不能指定WRITE屬性宽菜,setFunction的返回值必須為void且參數(shù)只能有一個
?MEMBER memberName :MEMBER表示指定成員, memberName表示被指定的類成員變量名稱竿报,類成員變量的命名上與屬性應(yīng)該有區(qū)分(通常命名規(guī)范中類成員變量前應(yīng)添加m_以表示成員變量而屬性無需添加如:成員變量m_value與屬性value )铅乡,該屬性用于設(shè)置成員變量memberName具備可讀可寫性質(zhì);注:若沒指定READ則必須指定MEMBER
?RESET resetFunction :表示重置屬性為默認(rèn)值烈菌, resetFunction不能有參數(shù)和返回值
?NOTIFY notifySignal :表示指定與屬性關(guān)聯(lián)的信號notifySignal阵幸,即當(dāng)屬性值變化時就會觸發(fā)信號notifySignal
?REVISION int :設(shè)置版本號,默認(rèn)為0
?DESIGNABLE bool:表示設(shè)置屬性在Qt設(shè)計師的屬性編輯器中是否可見芽世,默認(rèn)為true(可見)
?SCRIPTABLE bool:表示設(shè)置屬性是否可被腳本引擎訪問挚赊,默認(rèn)為true
?STORED bool:設(shè)置保存對象狀態(tài)時是否必須保存屬性值,多數(shù)情況默認(rèn)為true
?USER bool:設(shè)置屬性是否為可編輯屬性济瓢,每一個類只能有一個USER屬性指定荠割,默認(rèn)為false
?CONSTANT:表示屬性值是常量,常量屬性不能指定WRITE與NOTIFY選項(xiàng)
?FINAL:表示屬性不能被子類重寫
以上方式設(shè)置的是靜態(tài)屬性旺矾,在Qt中的類還可以設(shè)定動態(tài)屬性涨共,所謂動態(tài)屬性就是未使用Q_PROPERTY宏注冊而通過調(diào)用QObject::setProperty()方法添加的屬性。動態(tài)屬性可通過設(shè)置無效的QVariant對象進(jìn)行刪除該動態(tài)屬性宠漩,另外動態(tài)屬性屬于類對象的實(shí)例举反,不滿足元對象屬性機(jī)制,不能使用元對象獲取動態(tài)屬性信息扒吁,但可使用QObject::property()進(jìn)行屬性值的獲取火鼻。
QVariant property(const char *name) const
作用:獲取指定名稱屬性的值,若指定名稱的屬性不存在則返回?zé)o效的QVariant
bool setProperty(const char *name, const QVariant &value)
作用:設(shè)置指定名稱屬性的值雕崩,若設(shè)置的屬性已用Q_PROPERTY在類中注冊魁索,且值類型與屬性類型兼容(Qt中可自動轉(zhuǎn)換的類型)則設(shè)定屬性值為value并返回true,若給定值類型不兼容則值設(shè)定無效并返回false盼铁;若設(shè)置的屬性未使用宏定義Q_PROPERTY在類中注冊粗蔚,則動態(tài)添加指定名稱的屬性并設(shè)置給定值,此時也返回false
使用setProperty和property方法也可以設(shè)置和獲取靜態(tài)屬性信息饶火,若屬性有相關(guān)聯(lián)的讀取和寫入函數(shù)(getFunction與setFunction鹏控,通常Qt中屬性獲取函數(shù)的名稱定義時前面不添加get),則可使用對應(yīng)的讀寫函數(shù)進(jìn)行讀取和寫入肤寝。
文章來源:學(xué)到牛牛 www.xuedaon.com