簡要原始碼分析Q PROPERTY

2021-10-12 04:54:27 字數 3004 閱讀 6898

本文不打算像文件一樣翻譯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號稱是泛型程式設計的典範,泛型程式設計不僅僅是模板的高階應用,這裡更多體現了整體的設計思想。空間配置器 迭代器 容器 演算法 仿函式 介面卡,共六大元件,其中這裡比較關心的就是前四個。這裡面涉及了模板 模板的偏特化 ...