2

我是 Python 和 PyQt 的新手。保持 4 个 QtTreeWidgets 同步以使项目以及所有项目的所有属性相同的最佳方法是什么?这些小部件在会话期间的不同时间出现在不同的对话框中。出于多种原因,我需要尽可能多地保持现有代码、信号和布局的完整性。模型/视图部门显然是第一个去的地方,但我不想触及任何用于访问或更新树的方法。我计划在几个月内重构整个东西,但在那之前我需要一些快速的东西来支撑我。

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

当每个对话框被初始化时,树就会出现。该应用程序有一个单例类,所有对话框都可以使用它来引用其变量/属性。

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

如何通过对现有代码库和 GUI 布局的最少更改来实现这一点?

约翰

4

2 回答 2

3

是的,使用 MVC 设施是要走的路……

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

如果您需要为小部件(树的哪些部分打开或关闭)保持相同的选择状态,这可能会有点困难,但它实际上可能通过使用相同的 selectionModelselectionModel()setSelectionModel()

于 2011-09-04T13:04:49.227 回答
0

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

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

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

通过将每个 QTreeWidget 的信号和插槽连接到单个其他对象,您可以避免让每个树小部件都了解其他小部件的噩梦。

于 2011-09-04T08:20:31.843 回答