我有一個分層數據結構,可以在幾個Qt視圖(或小部件)中可視化。數據層次結構由異質元素類型,如:在異構數據層次結構的不同視圖之間拖放
House
|- Floor
| |- Room
| | |- Window
| | |- ...
| |- Room
| | |- ...
|- ...
所有元素(樓,樓層,房間,...)有一個可以顯示的屬性。請注意,這是一個簡化的例子。層次結構由各種視圖繪製。例如。只是模板列表(QListView/Widget)中的房間標識符,自定義視圖(每個元素的QWidget子類層次結構),編輯屬性的詳細視圖等。一個地板(QWidget子類或QWizard)。
也可以在幾個實例之間拖放元素。例如。將房間移動到不同的樓層。可以將特定樓層聲明爲模板,並且可以從例如模板列表中拖拽樓層。自定義視圖(組成房屋的地方)。
Qt使用Model/View architecture來分隔數據,模型和視圖。因爲我有完全不同類型的視圖,所以我假設每個視圖都需要相應的模型。在我的自定義層次視圖的情況下,每個元素都有自己的可視化,因此層次結構存在(但不應該存在)三次:數據層次結構,模型層次結構和視圖層次結構。這變得非常混亂,因爲每個層次結構都必須更新,如果一個元素被拖放,刪除或複製。更好的方法是Presentation-Abstraction-Control模式。但是,PAC不適用,因爲必須設置QWidget的父項,以便將子項嵌入其父視圖中。因此,QWidget無法引用負責建立層次結構的代理。
在我看來,Qt在代表同類數據類型(如字符串)的列表,表和樹方面非常出色。就我而言,每個元素都有一組獨立的屬性,不能簡單地以表格的形式表示。在這個discussion不鼓勵強迫一個正方形釘入一個圓孔。意思是,不要以表格形式強制任何設計。
我的問題的核心是在一個設計概念中統一下列功能:用不同層次的細節對分層數據進行可視化。支持視圖之間的拖放操作,從而複製數據並生成適當的模型/視圖組件。在視圖中支持拖放,這會影響數據,模型和視圖層次結構(我希望避免實施三次)。由於樓層和房間太複雜,我無法爲其所有子組件提供一個房屋模型。我發現爲一個拖放,刪除或複製操作管理三個(或更多)層次結構是很笨拙的。
是否有最佳做法,設計模式或對我的問題採取不同的方法?這個問題是否可以用Qt解決?
我很感謝每一個建議。
我錯過了與QObject不同的QStandardItem可以克隆的事實。利用UserRole似乎也是「數量」。我必須考慮你的建議,但現在看來,我正在尋找。我會回到你身邊。 – Marian