QT內省機制 自定義Model 資料庫

2022-07-15 10:15:13 字數 4289 閱讀 4921

本文將介紹自定義model過程中資料庫資料來源的獲取方法,我使用過以下三種方式獲取資料庫資料來源:

本文重點介紹第二種,即利用qt的內省機制來獲取資料。

1.自定義model過程(通過內省功能獲得字段值,也就是第二種方法)

本文中自定義model繼承於qabstracttablemodel ,重點描述setdata(..)函式與data(...)函式的過載過程。

首先需要介紹 parameter類,該類用於儲存查詢資料庫中某錶所得的字段值。

1

加粗單詞為成員變數3//

假設資料庫中某錶有三個欄位index,name,describe45

class parameter : public

qobject

6 //

用q_invokable宣告後才能被元物件(qmetaobject)呼叫

12 q_invokable void setindex(const qvariant &value)

1314 q_invokable qvariant getname() const

15 q_invokable void setname(const qvariant &value)

1617 q_invokable qvariant getdecribe() const

18 q_invokable qvariant setdescribe(const qvariant &value)

1920 qmap getmethodgetindexs()const;//

獲得「取值器」函式(即getxx函式) 的索引值列表,這些函式都被q_invokable宣告過

21 qmap getmethodsetindexs() const;//

獲得「設定器」函式(即setxx函式) 的索引值列表,這些函式都被q_invokable宣告過

2223

private:24

void setmethodgetindexs(); //

設定「取值器」函式(即getxx函式) 的索引值列表,這些函式都被q_invokable宣告過

25void setmethodsetindexs(); //

設定「設定器」函式(即setxx函式) 的索引值列表,這些函式都被q_invokable宣告過

2627

static

intgetnewindex();

2829

intindex;

30qstring name;

31qstring describe;

3233 qmapmethodgetindexs;

34 qmapmethodsetindexs;

35 };

1

23 parameter::parameter(qobject *parent) :

4qobject(parent),

5index(getnewindex()),

6 name("

unnamed"),

7 describe("")8

1213

void

parameter::setmethodgetindex()

1425

26void

parameter::setmethodsetindexs()

2737

38 qmap parameter::getmethodsetindexs() const

3942

43 qmap parameter::getmethodgetindexs() const

4447

48int

parameter::getnewindex()

49

parameter類宣告了對應資料庫表中字段(field)的成員變數,並分別為這些成員變數編寫了setxx()函式和getxx()函式,並對這些函式進行q_invokable宣告

然後,在setmethodgetindexs()函式 與 setmethodsetindexs()函式中,使用qmetaobject::indexofmethod(...)函式獲取每個函式在qmetaobject物件中的索引值,將該按順序索引值存入到容器中,其插入順序與tablemodel中的字段順序一致。

最後,在tablemodel中呼叫parameter類的getmethodsetindexs()函式與getmethodgetindexs()函式獲得索引值列表。

1

2class tablemodel : public

qabstracttablemodel

3static tablemodel::qlistgettableparameters()

int tablemodel::rowcount(const qmodelindex &parent =qmodelindex())

int tablemodel::columncount(const qmodelindex &parent) const

qvariant tablemodel::data(

const qmodelindex &index, int role) const

return

specificdata(index,role);

}qvariant tablemodel::specificdata(

const qmodelindex &index, int role)const

return

qvariant();

}qvariant tablemodel::specificindexvalue(

const qmodelindex &index) const

int tablemodel::getmethodgetindex(const qmodelindex &index) const

qmetamethod tablemodel::getmetamethod(

const qmodelindex &index,int methodindex) const

bool tablemodel::setdata(const qmodelindex &index, const qvariant &value, int

role)

bool tablemodel::setspecificdata(const qmodelindex &index,

const qvariant &value)

return

false;}

int tablemodel::getmethodsetindex(const qmodelindex &index)

成員變數 qlistdataparameters中儲存了資料庫表中的字段值,且每個parameter物件代表一條記錄。

我們知道,tablemodel資料的顯示與rowcount()、columncount()、data()函式息息相關,我們過載了這三個函式。

為了讓model的行和列與dataparameters一一對應:

令rowcount()函式返回dataparameters的條目數(行數目);

令columncount()返回dataparameters中每條記錄的字段數目(列數目)。

對於variant data(const qmodelindex &index, int role) const函式,在選定的role下,呼叫specificindexvalue(const qmodelindex &index)函式,根據索引值獲得行號和列號,先根據行號確定容器中某乙個parameter物件(即某一條記錄),然後再根據列號,獲得該parameter物件中支援 元物件呼叫的 函式的索引值(如getmethodgetindex()函式所示),獲取函式索引值後,如getmetamethod()所示,可獲得qmetamethod物件,然後呼叫invoke()函式,賦予合適的引數值,就等價於呼叫當前函式索引值對應的那個函式。

這樣做的好處在於,可直接通過行號與列號進行定址,避免了條件判斷語句,使**大大提高了簡潔性與復用性。

setdata()函式與data()函式類似,不再詳述。

總結:利用內省機制獲得物件的成員函式,並呼叫之,能夠避免複雜的條件判斷邏輯,能夠提高復用性。但是,在這裡沒有提及的有效能問題,我沒有研究對效能會有什麼影響,當然,簡單的pc軟體是基本看不到影響的,其次,利用parameter類儲存資料庫表字段值,使parameter只能用於同乙個表,那麼每個返回資料庫字段值的函式也就只能服務於同乙個表,這樣也會有很多重複**產生。所以接下來,我將進一步改進,放棄利用自定義類而使用qvariantlist類來儲存資料庫表的每一條記錄。

QT 自定義Model及相關demo

隨著開發專案的不斷增大,業務結構越來越複雜,為了提高程式設計師的開發效率和降低維護成本 的可讀性 在qt中使用mvc mvd 模式是行之有效的方法。而自定義model則是使用mvc模式的第一步。qt給我們預定義了許多model,view和delegate,也就是說我們可以很方便快速的繼承相應的類完成...

匯入自定義模組model

編寫m2.py,指令碼內容如下 usr bin python coding utf 8 its a module test author mm import sys 定義函式ft defft x x int x sum x 3 print sum ft sys.argv 1 直接執行指令碼 m2.p...

自定義元件中的model

handlechange 很好奇沒有找到父元件中定義的change,並且發現自定義元件中有乙個 export default 下面的prop不碼了搜尋了vue 文件才發現是為了避免衝突才這樣設定的 乙個元件上的 v model 缺省會利用名為 value 的 prop 和名為 input 的事件,但...