2012-11-17 88 views
3

Qt中的模型是否應該或多或少地適合模具 - 因此最終可以用列表,表格或樹來表示?如果你的模型複雜得多,不能用列表,表格或樹來表示呢?Qt模型/視圖體系結構 - 如何處理更復雜的模型

如果是這樣的話,我會認爲這只是一個模型,不過是數據;與XML文件或電子表格相媲美的東西。

示例:如果有問題的應用程序中的模型比汽車更復雜,會怎麼樣?我會假設一輛汽車的模型將包含關於汽車的各種數據和業務規則。將會有一臺發動機,車輪,一個車架和許多其他不同的部件一起工作來創造整個汽車。每個組件都有自己獨特的一組行爲:框架會有一個顏色,引擎會有溫度,立體聲會有音量設置,等等。而且每個部件也會有一些行爲:如果油門踏板被踩下,車輪會轉動,引擎發熱。顯然,一個QStringListModel或其他一些內置的簡化模型不能適當地解決汽車中的所有複雜問題。

+0

你真的有問題嗎?這是一個質量保證網站,您需要提出具體的,可回答的問題。 「我認爲我是誤解」不是一個問題。 – sashoalm

+0

我編輯了我原來的帖子,以更直接的形式直接提出問題。希望現在它對QA更友好。我對最初缺乏重點/清晰度表示歉意。 – nairware

回答

2

模型不是數據,而是一組回調。事實上,不需要真正的數據留在模型之後。它更像是一個被查詢的服務器。

這是這樣的區別:

int data[5] = { 0, 2, 4, 6, 8 }; 
void viewer(int *data, int n) { 
    for (int ii = 0; ii < n; ii++) 
     printf("%d, ", data[ii]); 
} 
int main() { 
    viewer(data, 5); 
} 

這:

int model(int index) { 
    return index * 2; 
} 
typedef int (*model_function)(int); 
void viewer(model_function model, int n) { 
    for (int ii = 0; ii < n; ii++) 
     printf("%d, ", model(ii)); 
} 
int main() { 
    viewer(model, 5); 
} 

都將給你0, 2, 4, 6, 8,但該模型實際上並不需要一個數組來提供相同的值。

+0

汽車對象也是如此 - 包括它的所有特徵和行爲 - 實際上不是模型/視圖框架的一部分?根據你的解釋,這聽起來像是模型是建立在汽車之外的,但它並不代表汽車本身。它是真正的汽車對象(我以前認爲是模型)和視圖之間的某種媒介。 – nairware

+0

你可以這麼說。這就是爲什麼使用「模型」這個詞 - 它是汽車的典範。更像是一個界面,真的。關鍵是,視圖查詢模型,而不知道它背後是什麼。該模型就像一箇中間人,或者視圖與實際對象之間的接口。這樣,如果對象發生變化,則只需更改模型,但視圖可以保持不變。所以它描述的模型和底層對象是不一樣的。 – sashoalm

+0

在Qt中,我認爲您的示例中的整數列表可以使用QListItemModel來表示。但是,如果我們有一個更復雜的數據結構(例如上面描述的汽車),我會假設你會基本上堅持構建你自己的模型類,在這種情況下,你會從QAbstractItemModel開始。是這樣嗎?此外,我不知道該從哪裏開始,但我會認爲這將是一個類似的從頭開始的努力,因爲列表/表格/樹可能(可能)不足以可視地表示汽車。 – nairware

1

試着在這裏閱讀有關Qt中的MV:similar question on SO,當然,在Model/View Programming at http://qt-project.org/等資源上。此外,有很多有趣的視頻由VoidRealms,包括這個主題 - VoidRealms: C++ Qt 47 - Intro to model view programming

試着理解它,特別是在Qt中它是如何的,所有的問題和你的誤解都會消失。

+0

我認爲我正在尋找的評論是@leemes在第一個鏈接中的第二個答案:「Qt的MVC只適用於一個數據結構,當談論MVC應用程序時,您不應該考慮QAbstractItemModel或QListView。該VoidRealms視頻是一個很好的解釋,在Qt中使用ListView來表示一個字符串列表。正如我在我原來的問題中解釋的那樣,我試圖找出如何做更復雜的事情。我沒有看到如何在應用程序級別實現模型/視圖框架,也沒有看到如何實現複雜模型(例如汽車)。 – nairware