Синхронизированные Qt TreeWidgets - PullRequest
2 голосов
/ 04 сентября 2011

Я новичок в Python и PyQt.Каков наилучший способ синхронизации 4 QtTreeWidgets, чтобы элементы были такими же, как и все атрибуты всех элементов?Эти виджеты появляются в разных диалоговых окнах в разное время в течение сеанса.По ряду причин мне необходимо сохранить как можно большую часть существующего кода, сигналов и компоновки.Разделение Модель / Представление было бы очевидным первым делом, но я не хочу касаться каких-либо методов, которые используются для доступа или обновления дерева.Я планирую провести рефакторинг всего этого через несколько месяцев, но мне нужно что-то быстро перенести меня до тех пор.

Поскольку каждый QTreeWidget является вспомогательным классом, у каждого есть свои данные.Пользовательский интерфейс поддерживается в Qt Designer, и я не хочу, чтобы он оставался таким.

Когда каждый диалог инициализируется, появляется дерево.Приложение имеет одноэлементный класс, который все диалоги могут использовать для ссылки на его переменные / атрибуты.

При инициализации каждого родительского диалога я не мог проверить, существует ли атрибут «locationTree» в синглтоне.Если нет, то мне нужно заполнить его исходным состоянием и использовать дерево в диалоговом окне или его копию.Каждый раз, когда состояние диалогового дерева изменяется так, что я могу его перехватить, я бы хотел обновить синглтон locationTree, чтобы отразить изменение.Хотя в QTreeWidgetItem есть метод клонирования, я не видел соответствующего метода для всего QTreeWidget.

Как я могу добиться этого с наименьшим количеством изменений в существующей базе кода и компоновке GUI?

Джон

Ответы [ 2 ]

3 голосов
/ 04 сентября 2011

Да, использование средств MVC - это путь ...

Даже если вы используете QTreeWidget, вы все еще работаете с классом, производным от QAbstractItemView, поэтому model() и setModel() звонки доступны.Возьмите модель из одного из созданных вами виджетов, а затем установите ее в других виджетах.Всякий раз, когда вы изменяете данные в одном из виджетов, другие виджеты будут следовать их примеру, поскольку они используют один и тот же экземпляр модели.

Если вам нужно поддерживать одинаковое состояние выбора во всех для виджетов (какие частидерево открыты или закрыты), что может быть немного сложнее, но на самом деле это может работать с использованием одинаковых selectionModel selectionModel() и setSelectionModel()

0 голосов
/ 04 сентября 2011

Я уверен, что вы правы, что использование Model / View - лучший подход.

Но без представления о том, сколько примерно элементов будет у ваших древовидных виджетов, и как часто они будут обновляться, трудно взвесить альтернативные подходы. Кроме того, какую версию Qt вы используете?

Если количество обновлений и элементов невелико, один из подходов состоит в том, чтобы ввести класс, который наследует QObject (поэтому он имеет сигналы и слоты), и сделать его ответственным за синхронизацию всех ваших QTreeWidgets.

Подключая сигналы и слоты для каждого QTreeWidget к одному другому объекту, вы избегаете кошмара, когда каждый виджет дерева знает обо всех остальных.

...