本文不打算像文件一樣翻譯q_property,而是從原始碼的角度來看看怎麼使用q_property
qt的property官方的定義,為了保持格式,我特地截圖,如下
毫無疑問, qt的moc系統對q_property有特別的處理,我們現在看看他處理了什麼.
首先,定義乙個類test,**如下:
class test : public qobject
;
qt的moc會自動生成moc_test.cpp,備份一下這個檔案
然後,加上乙個屬性描述:q_property(bool enabled read isenabled write setenabled)
對比官方的定義,我標識一下,看得更清楚
增加q_property後,的**如下,只增加了一行**:
class test : public qobject
;
重新編譯,由於我們沒有實現函式isenabled和setenabled,所以是編譯不過的,出現如下錯誤資訊:
但這說明moc已經工作了,並且生成了額外的**,我們和剛剛沒有加q_property的**對比一下看看:
由上圖可以看出,增加了一些properties的標識,
增加了字串"bool"和"enabled"
並且qt_metacall裡增加了一些函式呼叫,如下圖:
從圖中我們可以看出,我們必須要自己實現函式isenabled和setenabled,否則別想編譯過.
那好,增加這兩個函式的實現**
class test : public qobject
bool isenabled() const
private:
bool m_benable;
};
我們實現了setenabled和isenabled,
然而,你可能會反問,這不就是個屬性嘛,為了防止直接訪問內部變數,我也經常寫這樣的**啊.這樣寫的好處是保護成員變數不被意外修改.
然而,我想說的是,qt屬性系統的精髓在於,可以用qobject的方法來訪問繼承類的屬性.
還記得前面嗎,增加了字串"bool"和"enabled"
來,我們看看如何用基類來訪問屬性.
int main(int argc, char *ar**)
執行結果為:
false
false
true
true
這就充分說明了,如何使用qobject的設定和訪問屬性
********************=== 另乙個例子的分割線 ********************==
接下來再看乙個qt文件中的例子,分析手法和上面一樣
首先,來個最簡單的,類定義如下:
class myclass : public qobject
;
備份自動生成的moc_myclass.cpp
增加乙個enum,並指明是q_enums
class myclass : public qobject
; q_enums(priority)
};
看下對比,enum增加了哪些東西
可以看出,增加了enum的一些東西,還增加了字串"priority", "high", "low", "veryhigh", "verylow"
接著,增加一行屬性定義
q_property(priority priority read priority write setpriority notify prioritychanged)
為了方便檢視,我還是標識出來
增加後**如下(由於我們增加了notify,所以還要增加乙個signal prioritychanged, 不然moc編譯不過):
class myclass : public qobject
; q_enums(priority)
signals:
void prioritychanged(priority);
};
對比一下:
增加了字串"prioritychanged(priority)"
注意,增加字串"priority",這個字串是用來描述屬性priority q_property(priority
priority
...)
繼續比較
和上面分析test類一樣,不同點在於現在這個類增加了乙個signal
好了,我們把類實現完全,增加函式setpriority和priority
class myclass : public qobject
; q_enums(priority)
signals:
void prioritychanged(priority);
public:
void setpriority(priority priority)
priority priority() const
private:
priority m_priority;
};
然後,我們用同樣的手法,寫乙個呼叫測試
myclass *myinstance = new myclass;
qobject *object = myinstance;
object->setproperty("priority", "veryhigh");
qdebug() << object->property("priority").touint() << endl;
delete myinstance;
列印輸出
22在enum priority 中就表示veryhigh
總結:qt的屬性系統為我們提供了在基類訪問子類的屬性的方法,非常nice.
參考:**:
Java Hashtable 原始碼簡要分析
hashtable比較早,是執行緒安全的雜湊對映表。內部採用entry陣列,每個entry均可作為鍊錶的頭,用來解決衝突 碰撞 hashmap與hashtable基本原理一樣,只是hashmap允許null的key value,且非執行緒安全。linkedhashmap從字面看有兩個意思,hash和...
spring原始碼分析 spring原始碼分析
1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...
STL原始碼剖析 整體簡要概述
stl原始碼剖析 簡要概述 首先需要明白stl內部各個元件以及元件之間的關係,stl號稱是泛型程式設計的典範,泛型程式設計不僅僅是模板的高階應用,這裡更多體現了整體的設計思想。空間配置器 迭代器 容器 演算法 仿函式 介面卡,共六大元件,其中這裡比較關心的就是前四個。這裡面涉及了模板 模板的偏特化 ...