В Qt я пишу свою собственную древовидную модель (путем создания подкласса QAbstractItemModel
), которая охватывает существующую структуру данных. Должна быть возможность обновлять структуру данных как внутри (не через модель), так и через модель (чтобы представления могли ее изменить). Чтобы представить это лучше: это граф сцены, который можно редактировать с помощью представления сцены (без использования модели Qt), а также с помощью планировщика (QTreeView
, который использует модель Qt в качестве прокси вокруг графа сцены).
Чтобы избежать путаницы, мы должны рассмотреть два разных сценария (далее я использую операцию «удалить» в качестве примера):
Пользователь использует представление Qt для удаления узла. Представление хочет удалить строку из модели, используя
QAbstractItemModel::removeRow
а>. Это, в свою очередь, должно удалить соответствующий узел из базовой структуры данных, графа сцены.Пользователь использует представление сцены для удаления узла. Представление сцены хочет удалить узел из графа сцены. Модель, которая окружает граф сцены, получает уведомление и, в свою очередь, хочет уведомить подключенные представления о том, что строка была только что удалена.
Хотя я думаю, что знаю, как реализовать 1., я не знаю, как реализовать уведомляющую часть в 2. Есть сигнал QAbstractItemModel::rowsAboutToBeRemoved()
, а также rowsRemoved()
, которые звучат так, будто они мои друзья. Но это приватные сигналы (в исходном коде шапки написано: "может быть испущен только QAbstractItemModel"). Также есть beginRemoveRows()
и endRemoveRows()
, но, согласно их документации, их следует вызывать при обновлении из представления, т. е. при вызове removeRow
. Кроме того, когда я пытался их использовать, вид был полностью испорчен.
Согласно документации, кажется, что класс модели не может моделировать самоизменяющиеся данные. Возьмем файловую систему в качестве другого примера. При использовании наблюдения за файловой системой, которое может обнаруживать изменения в каталогах, модель должна уведомлять представление, чтобы изменения в каталоге могли отображаться в реальном времени, даже если представление не использовалось для изменения файловой системы. Возможны ли такие модели в Qt?