2011-05-23 90 views
0

我有以下問題。QTreeView和QSqlQueryModel - 根據需要從sql數據庫加載兒童

我想爲我的QTreeView實現一個模型,它將動態地從sql表中加載數據。

表看起來是這樣的:

CREATE TABLE xcmObjects 
(
    id      INT    AUTO_INCREMENT PRIMARY KEY NOT NULL, 
    id_parent    INT    DEFAULT 0 NOT NULL , 
    title     TEXT 

); 

id_parent包含父記錄的ID - 使他們形成一個結構。

我希望我的模型只在需要時從該表中加載數據。換句話說,我不想將完整的結構加載到內存中,而是不想讀取僅由用戶打開的那些節點的子節點。

QSqlQueryModel和QSqlTableModel似乎只適用於平面表。

我認爲這個問題的一個解決方案是實現自定義QAbastractItemModel類和店內獨立的QSqlQueryModel實例爲每個打開的節點(包括頂級不可見的父節點)。然後重寫每個方法並將請求轉發給合適的模型。

也許有一些更簡單的解決方案? :-)

感謝您的幫助。

+1

爲什麼你不想實現你自己的模型,而不在裏面存儲幾個QSqlQueryModels?以QT樹模型爲例,創建自己的項目,爲其添加延遲初始化,使初始化程序執行QSqlQuery,這是非常簡單的... – Raiv 2011-05-24 09:44:24

+0

謝謝Raiv :)我正在考慮你的想法。爲了告訴你實際情況,我寧願不爲已在查詢結果中完整描述的節點分配額外的內存。 – Seba 2011-05-26 11:21:11

回答

1

我不認爲這將是很難通過QAbstractItemModel的子類來做到這一點。您的頂層將是parent_id爲0時表中的所有項目。將每個項目的ID存儲爲QModelIndex類的內部數據,然後您可以使用傳遞給各種函數的父索引構造數據的新查詢。

+0

好想法。但是在QAbstractItemModel方法:: data,:: index,:: parent,:: rowCount中都是const。我無法從這些函數內部修改memeber對象(如QSqlQuery-s)。任何提示如何解決此問題? :-) Thx很多 – Seba 2011-05-26 11:16:35

+0

嗯我忘了我可以使成員對象可變。 – Seba 2011-05-26 11:40:04