qt屬性系統(tǒng)降瞳,學(xué)到牛牛

得益于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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末当辐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鲤看,更是在濱河造成了極大的恐慌缘揪,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異找筝,居然都是意外死亡蹈垢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門袖裕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來曹抬,“玉大人,你說我怎么就攤上這事陆赋°宓唬” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵攒岛,是天一觀的道長赖临。 經(jīng)常有香客問我,道長灾锯,這世上最難降的妖魔是什么兢榨? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮顺饮,結(jié)果婚禮上吵聪,老公的妹妹穿的比我還像新娘。我一直安慰自己兼雄,他們只是感情好吟逝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赦肋,像睡著了一般块攒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上佃乘,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天囱井,我揣著相機(jī)與錄音,去河邊找鬼趣避。 笑死庞呕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的程帕。 我是一名探鬼主播住练,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼骆捧!你這毒婦竟也來了澎羞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤敛苇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枫攀,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡括饶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了来涨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片图焰。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蹦掐,靈堂內(nèi)的尸體忽然破棺而出技羔,到底是詐尸還是另有隱情,我是刑警寧澤卧抗,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布藤滥,位于F島的核電站,受9級特大地震影響社裆,放射性物質(zhì)發(fā)生泄漏拙绊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一泳秀、第九天 我趴在偏房一處隱蔽的房頂上張望标沪。 院中可真熱鬧,春花似錦嗜傅、人聲如沸金句。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽违寞。三九已至,卻和暖如春币他,著一層夾襖步出監(jiān)牢的瞬間坞靶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工蝴悉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留彰阴,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓拍冠,卻偏偏與公主長得像尿这,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子庆杜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容