Python 同步Qt树状线

Python 同步Qt树状线,python,qt,pyqt,qtreewidget,Python,Qt,Pyqt,Qtreewidget,我不熟悉Python和PyQt。保持4个QTtreeWidget同步的最佳方法是什么,以便项目以及所有项目的所有属性都相同?这些小部件在会话期间的不同时间出现在不同的对话框中。出于许多原因,我需要尽可能完整地保存现有的代码、信号和布局。模型/视图分区显然是第一个选择,但我不想触及用于访问或更新树的任何方法。我计划在几个月内对整个事情进行重构,但在此之前我需要一些快速的东西 由于每个QTreeWidget都是一个方便类,因此每个都有自己的数据。UI是在Qt Designer中维护的,我不想保持这种

我不熟悉Python和PyQt。保持4个QTtreeWidget同步的最佳方法是什么,以便项目以及所有项目的所有属性都相同?这些小部件在会话期间的不同时间出现在不同的对话框中。出于许多原因,我需要尽可能完整地保存现有的代码、信号和布局。模型/视图分区显然是第一个选择,但我不想触及用于访问或更新树的任何方法。我计划在几个月内对整个事情进行重构,但在此之前我需要一些快速的东西

由于每个QTreeWidget都是一个方便类,因此每个都有自己的数据。UI是在Qt Designer中维护的,我不想保持这种状态

初始化每个对话框时,将显示树。应用程序有一个单例类,所有对话框都可以使用该类引用其变量/属性

在每个父对话框的初始化中,我无法检查singleton中是否存在“locationTree”属性。如果没有,我需要用它的初始状态填充它,并让对话框中的树使用它或它的副本。每当对话框树的状态以我可以捕获的方式改变时,我都会更新单例“locationTree”以反映更改。虽然QTreeWidgetItem上有一个clone方法,但我没有看到整个QTreeWidget的对应方法

如何在对现有代码库和GUI布局进行最少更改的情况下实现这一点


John

我相信您是对的,使用模型/视图是最好的方法

但是,如果不知道您的树小部件将拥有多少项,以及更新的频率,就很难衡量其他方法。另外,您使用的是什么版本的Qt

如果更新和项目的数量不是很大,一种方法是引入一个继承
QObject
(因此它有信号和插槽)的类,并让它负责保持所有qtreewidget的同步


通过将每个QTreeWidget的信号和插槽连接到一个单独的其他对象,您可以避免让每个tree widget都知道其他对象的噩梦。

是的,使用MVC设施是一种方法

即使您正在使用
QTreeWidget
您仍然在使用从
qabstractemview
派生的类,因此
model()
setModel()
调用可用。从您正在创建的一个小部件中获取一个模型,然后在其他小部件中设置它。每当您更改其中一个小部件中的数据时,其他小部件都会跟随,因为它们使用相同的模型实例


如果您需要在所有for窗口小部件(树的哪些部分是打开的或关闭的)中保持相同的选择状态,这可能会有点困难,但使用相同的selectionModel
selectionModel()
setSelectionModel()

我现在正在使用PyQt 4.4.4。树中可能有24到24000个节点,这需要大量复制。请注意——如果您只需要信号/插槽功能,通常类应该继承QObject。抱歉-我的意思是键入“QObject”,而不是“QWidget”-非常感谢您指出错误。我将编辑上面的文本。