同步的Qt TreeWidgets

2 投票
2 回答
513 浏览
提问于 2025-04-17 01:22

我刚开始学习Python和PyQt。请问有什么好的方法可以让四个QtTreeWidget保持同步,让它们的内容和所有项目的属性都一致吗?这些小部件会在不同的对话框中出现,时间也不一样。由于一些原因,我希望尽量保留现有的代码、信号和布局。虽然使用模型/视图的分离是个不错的选择,但我不想动任何用来访问或更新树的方法。我计划几个月后重构整个项目,但现在我需要一个快速的解决方案来应付这段时间。

每个QTreeWidget都是一个方便的类,它们各自有自己的数据。用户界面是用Qt Designer维护的,我不想继续这样做。

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

在每个父对话框的初始化中,我能不能检查一下单例中是否存在一个'locationTree'属性?如果没有,我就需要用它的初始状态来填充这个属性,并让对话框中的树使用它或它的副本。每当对话框树的状态发生我能捕捉到的变化时,我希望更新单例中的'locationTree'以反映这个变化。虽然QTreeWidgetItem上有一个克隆方法,但我没有看到整个QTreeWidget的对应方法。

我该如何在尽量少改动现有代码和GUI布局的情况下实现这个目标呢?

约翰

2 个回答

0

我相信你说的对,使用模型/视图的方式确实是最好的选择。

不过,如果你不知道你的树形控件大概会有多少个项目,以及它们更新的频率,那就很难考虑其他的解决方案。另外,你用的是什么版本的Qt呢?

如果更新的数量和项目不多,可以考虑创建一个类,让它继承QObject(这样它就可以使用信号和槽),并让这个类负责保持所有的QTreeWidgets同步。

通过把每个QTreeWidget的信号和槽连接到一个单独的对象,你就可以避免每个树形控件都要知道其他控件的麻烦。

3

是的,使用MVC的方式是最好的选择...

即使你在使用QTreeWidget,你实际上还是在操作一个从QAbstractItemView派生出来的类,所以model()setModel()这些方法都是可以用的。你可以从你创建的某个控件中获取一个模型,然后把它设置到其他控件上。只要你在其中一个控件里修改了数据,其他控件也会跟着变化,因为它们使用的是同一个模型实例。

如果你想在所有四个控件中保持相同的选择状态(比如树的哪些部分是打开的,哪些是关闭的),这可能会有点难,但其实可以通过使用相同的选择模型selectionModel()setSelectionModel()来实现。

撰写回答