本文將介紹自定義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 };
123 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()函式獲得索引值列表。
12class 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 的事件,但...