2011-09-04 28 views
2

我是Python和PyQt的新手。什麼是保持4個QtTreeWidgets同步的最好方法,以便項目與所有項目的所有屬性相同?這些小部件在會話期間的不同時間出現在不同的對話框中。出於多種原因,我需要儘可能保持原有的代碼,信號和佈局儘可能完整。模型/視圖部門將是顯而易見的首要位置,但我不想觸摸任何用於訪問或更新樹的方法。我打算在幾個月內重構整個事情,但我需要一些東西來快速帶我到那時。同步的Qt TreeWidgets

由於每個QTreeWidget是一個便利的類,每個都有自己的數據。用戶界面在Qt Designer中維護,我不想這樣保留。

當每個對話框初始化時,樹會出現。應用程序有一個單例類,所有對話框都可以用來引用其變量/屬性。

在初始化每個父對話框時,我無法檢查singleton中是否存在'locationTree'屬性。如果沒有,我需要用它的初始狀態填充它,並讓對話框中的樹使用它或它的一個副本。任何時候,對話樹的狀態都會以我可以陷入的方式改變,我想更新singleton的'locationTree'來鏡像更改。雖然在QTreeWidgetItem上有一個克隆方法,但我沒有看到整個QTreeWidget的相應方法。

如何用現有代碼庫和GUI佈局進行最少量的更改來完成此操作?

約翰

回答

3

是使用MVC設施去...

即使您正在使用QTreeWidget你仍然從QAbstractItemView衍生因此model()setModel()調用可用的一類工作的方式。從您正在創建的其中一個小部件中取出一個模型,然後將其設置在其他小部件中。無論何時您更改其中一個小部件中的數據,其他小部件都會按照他們使用同一個模型實例的方式進行操作。

如果你需要保持所有部件(其樹的部分是打開或關閉),可能是有點困難了同樣的選擇狀態,但它實際上可能使用相同的selectionModel設置selectionModel()setSelectionModel()

工作
0

我相信你是對的,使用模型/視圖是最好的方法。

但是,如果沒有大致瞭解您的樹小部件將具有多少項目以及它們將更新的頻率,很難衡量其他方法。另外,你使用的是什麼版本的Qt?

如果更新和項目數量不是很大,一種方法是引入一個繼承QObject(因此它具有信號和插槽)的類,並使其負責保持所有QTreeWidget同步。

通過將每個QTreeWidget的信號和插槽連接到一個單獨的其他對象,可以避免每個樹小部件都知道其他每個對象的噩夢。

+0

我現在正在使用PyQt 4.4.4。樹中可能有24到24,000個節點,這是很多需要複製的。 – iwonder

+0

只需要注意 - 通常類應該繼承QObject,如果你想要的只是信號/插槽功能。 – Luke

+0

對不起 - 我真的打算輸入''QObject'',而不是'QWidget'' - 非常感謝您指出錯誤。我將編輯上面的文字。 –