解析Qt元物件系統(四) 屬性系統(確實比較方便)

2022-01-13 14:22:11 字數 2564 閱讀 6772

官方解釋

我們在qt原始碼中可以看到乙個qobject的子類經常會用到一些q_開頭的巨集,例如qmainwindow類開始部分**是這樣的:

q_property(qsize iconsize read iconsize write seticonsize)

q_property(qt::toolbuttonstyle toolbuttonstyle read toolbuttonstyle write settoolbuttonstyle)

......

public:

enum dockoption ;

q_enum(dockoption)

q_declare_flags(dockoptions, dockoption)

q_flag(dockoptions)12

3456

78910

1112

1314

15這幾個巨集也不是標準c++的內容,它們屬於qt的屬性系統,是元物件系統的一部分。使用屬性系統的類必須是qobject的子類,還得包含巨集q_object。

在標準c++中,為了保證封裝性,我們經常宣告乙個私有變數,然後宣告兩個公有函式,即set函式和get函式。在qt中我們可以使用巨集q_property來實現這些,還包括訊號的發射,後者實際是在set函式中實現的。

q_property(type name

read getfunction

[write setfunction]

[reset resetfunction]

[notify notifysignal] )

q_property(type name

member membername

[read getfunction]

[write setfunction]

[reset resetfunction]

[notify notifysignal] ) 12

3456

78910

1112

這是q_property的兩種簡單而常用的形式。

type 是指屬性的型別,可以是 c++ 標準型別、類名、結構體、列舉等

name 屬性的名字,僅僅是乙個用於標識屬性的名字,不是實際存在的成員變數

read 標出該屬性的讀函式 getfunction,qt 屬性的讀函式通常省略 get 三個字母。

write 標出該屬性的寫函式 setfunction,中括號表示可選,寫函式不是必須的。

reset 標出該屬性的重置函式

resetfunction,重置函式將屬性設為某個預設值,中括號表示可選,重置函式不是必須的。

notify 標出該屬性變化時發出的通知訊號 notifysignal,中括號表示可選,這個訊號不是必須的。

在明確標出屬性使用的成員變數的情況下,屬性的讀寫函式可以省略不寫,qt 的 moc 工具會自動為成員變數生成讀寫**。比如:

read, write以及reset可以被繼承,也可以是虛函式。property的型別可以是qvariant支援的任何型別,也可以是使用者定義的型別,這就是q_enum()的作用了。

列舉型別必須用q_enum()巨集註冊,這也是元物件系統的一部分,然後就可以使用qobject::setproperty(); 我們必須為read和write提供自己的宣告。

結合以上幾條,我們這樣寫乙個類:

class mainwindow : public qmainwindow

;q_enum(priority);

signals:

void valuechanged();

void prichanged();

private:

ui::mainwindow* ui;

int m_value;

priority m_priority;};1

2345

6789

1011

1213

1415

1617

18這樣就可以在類外呼叫相關函式了:

m.setproperty("value",15);

m.setproperty("prioity",mainwindow::veryhigh);

qdebug()<<"value:"《還有乙個巨集q_classinfo(),在類的宣告裡新增類附加資訊,比如:

q_classinfo("version", "1.0.0")

1附加資訊也是成對的「名稱-值」,不過注意 名稱和值 都是普通字串。如果希望在執行時查詢類的附加資訊,可以先用 qobject::metaobject() 獲取當前物件包含的元物件資料,然後使用 qmetaobject::​classinfo 函式查詢某個序號的附加資訊:

//類內宣告

q_classinfo("version", "1.0.0")

q_classinfo("author", "winland")

//類外使用

//獲取類的附加資訊

const qmetaobject *pmo = w.metaobject();

//附加資訊個數

int ninfocount = pmo->classinfocount();

Qt元物件系統

qmetaobject是負責元物件資訊的類,每個繼承自qobject的類都會有乙個qmetaobject物件,qobject物件共用該qmetaobject物件,給類提供遠多於c 預設的typeinfo提供的資訊。主要內容如下 1 類資訊 類 qmetaclassinfo q classinfo q...

Qt元物件系統

產生背景 qt的元物件系統為物件間的通訊提供了訊號槽機制 執行時型別資訊 動態屬性系統。核心內容 qt的元物件系統實現基於三方面 1.qobject基類。為能夠利用元物件系統的物件提供了乙個基類。2.q object巨集。用於實現元物件特性,如動態屬性 訊號槽。3.meta object compi...

Qt元物件系統

系統介紹 qt 元物件系統 meta object system qt的元物件系統基於如下三件事情 1.類 qobject,為所有需要利用元物件系統的物件提供了乙個基類。2.巨集 q object,通常可以宣告在類的私有段中,讓該類可以使用元物件的特性,比如動態屬性,訊號和槽。3.編譯器 元物件編譯...