最近學習了python 的描述器,想起之前學過的qt 的屬性系統,特此過來記錄一下。
qt的屬性系統需要借助元物件來實現:
q_property(type name
read getfunction
[write setfunction]
[reset resetfunction]
[notify notifysignal] )
用來為物件新增屬性,包括屬性的名稱,讀、寫重置介面和告知。重置一般講屬性設定為某個預設值,告知一般定義為訊號,而且一般在寫介面和重置介面的末尾發出該訊號。
此時定義的屬性,便能通過 .property() 來獲取,相當於 .property() 會呼叫這裡定義的讀方法;通過 .serproperty() 來設定屬性,相當於 .setproperty() 會呼叫寫方法。類似於python 的描述器,訪問時呼叫 __get__() 方法;改寫時呼叫 __set__() 方法。
另外,qt也支援動態在執行時為物件新增屬性,通過 .setproperty() 方法。
注意該方法只是為該物件動態新增,相當於python 的物件命名空間中,所以只有該物件能夠查詢得到。
列印物件所有的方法:
int mcount = w.metaobject()->methodcount();
for(int i = 0; i < mcount; ++i)
列印物件所有的屬性(動態新增的屬性無法包含其中):
int pcount = w.metaobject()->propertycount();
for(int j = 0; j < pcount; ++j)
列印所有的類資訊(通過 q_classinfo 新增的):
int infocount = w.metaobject()->classinfocount();
for(int i=0; iclassinfo(i).name() <<" "<< w.metaobject()->classinfo(i).value();
}
QT屬性系統
qt提供乙個q property 的巨集來定義屬性 read write member 指定乙個成員變數與屬性的關聯,成為可讀可寫屬性,無需子啊設定read,write屬性 reset 可選,設定乙個屬性預設值 notify 可選,設定乙個訊號,屬性變換的時候發射訊號 designable 是否在 ...
Qt屬性系統
qt提供了一套和其他通用編譯器提供商所提供的屬性系統類似的屬性系統 然而,作為乙個獨立於編譯器和平台的庫,qt不能依賴像 property或者 property 那樣的非標準編譯器特徵。qt的解決方案是在支援任意標準平台上的c 編譯器的基礎上進行工作。它基於元物件系統,元物件系統也通過訊號和槽提供物...
6 Qt 之屬性系統
qt提供乙個類似於其它編譯器 商提供的複雜屬性系統 property system 然而,作為乙個編譯器和平台無關的庫,qt不能夠依賴於那些非標準的編譯器特性,比如 property或者 property qt的解決方案適用於qt支援平台下的任何標準c 編譯器。它依賴於元物件系統 meta obje...