Моделирование самоизменяющихся моделей данных / оболочек в Qt

В Qt я пишу свою собственную модель дерева (путем подклассов QAbstractItemModel) который оборачивается вокруг существующей структуры данных. Должна быть предусмотрена возможность обновления структуры данных внутри (не через модель), а также через модель (чтобы представления могли ее изменить). Чтобы лучше это представить: это граф сцены, который можно редактировать, используя вид сцены (без использования модели Qt), но также используя планировщик (QTreeView который использует модель Qt в качестве прокси вокруг графа сцены).

Чтобы избежать путаницы, мы должны рассмотреть два разных сценария (в следующем примере я использую операцию «удалить»):

  1. Пользователь использует представление Qt для удаления узла. Представление хочет удалить строку из модели, используя QAbstractItemModel::removeRow. Это, в свою очередь, должно удалить соответствующий узел из базовой структуры данных, графа сцены.
    Звонки в сценарии 1

  2. Пользователь использует вид сцены для удаления узла. Представление сцены хочет удалить узел из графа сцены. Модель, которая оборачивается вокруг графа сцены, получает уведомление и, в свою очередь, хочет уведомить связанные представления о том, что строка была только что удалена.
    Звонки в сценарии 2

Хотя я думаю, что знаю, как реализовать 1., я не знаю, как реализовать уведомляющую часть в 2. Есть сигнал QAbstractItemModel::rowsAboutToBeRemoved() так же как rowsRemoved() Похоже, они мои друзья. Но они являются частными сигналами (они говорят в исходном коде заголовка: «может быть испущено только QAbstractItemModel»). Там также есть beginRemoveRows() а также endRemoveRows() но согласно их документации, они должны вызываться, когда обновления происходят из представления, то есть когда removeRow был вызван. Кроме того, когда я пытался их использовать, вид был полностью испорчен.

Согласно документации кажется, что класс модели не может моделировать самоизменяющиеся данные. Давайте возьмем файловую систему в качестве другого примера. При использовании отслеживания файловой системы, которое может обнаруживать изменения в каталогах, модель должна уведомить представление, чтобы изменения в каталоге могли отображаться в реальном времени, даже если представление не использовалось для изменения файловой системы. Возможны ли такие модели в Qt?

1

Решение

Вы читаете это неправильно. Модель должна сигнализировать своим пользователям, когда она собирается изменить свою «геометрию». Так что неважно какие удаляет строки из модели, она должна сообщить внешнему миру, что это произошло. Последовательность событий, когда представление удаляет строки из модели, такова:

  1. Вид звонков model->removeRows(),

  2. Модель звонит beginRemoveRows()

  3. Модель фактически удаляет строки из внутренних данных.

  4. Модель звонит endRemoveRows(),

Если вы реализуете какой-то другой интерфейс, который удалит строки без вызова model->removeRows()Вы должны сделать то же самое. Не имеет значения, является ли это представление или какой-либо другой код, который удаляет строки из модели, поведение модели должно быть таким же, иначе ничего не будет работать.

Вы можете создать класс адаптера, который будет вставлен между вашим SceneGraph и моделью. Он должен содержать указатель на граф сцены и модель и переводить операции между ними.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]