QAbstractItemModel изменить данные поддержки вне функций начала / конца - PullRequest
0 голосов
/ 26 мая 2018

TL; DR : Как я могу изменить структуры данных резервного копирования для подкласса o QAbstractItemModel за пределами функций beginInsertRows / endInsertRows, если можно переместить фактическое изменение массива резервного копирования до или после него?Это необходимо, потому что структура вспомогательных данных часто модифицируется через собственный интерфейс, и QAbstractItemModel служит просто его представлением для интеграции в Qt GUI.

У меня есть определенная древовидная модель данных в моем приложении.И у меня есть модель данных Qt, унаследованная от модели QAbstractItem, чтобы связать ее с управлением деревом Qt.Базовая модель данных изменяется независимо, поскольку использование ее повсеместно в приложении было бы слишком громоздким.

Сама проблема: базовая модель данных генерирует сигнал при изменении дочернего набора одного из его элементов.Я связываю модель данных Qt с этим сигналом.И только удалить индекс, который представляет этот элемент.Сам элемент все еще существует в исходном массиве и удаляется только после завершения emit.Это заставляет Qt пытаться ссылаться на этот же индекс в следующей итерации цикла событий, когда он содержит указатель на уже удаленную сущность.

Вопрос: есть ли способ правильно обновить индексы в модели данных Qt, когда актуальноНа хранение данных может повлиять какой-то внешний сигнал или код?Документация говорит, что добавление / удаление / перемещение элементов разрешено только между соответствующими начальными / конечными вызовами.Но это было бы очень громоздко, если вообще возможно в моем случае.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Мне удалось реорганизовать логику таким образом, чтобы внутренняя модель отправляла пары событий, одно до фактической операции и одно после.Изменение логики объектов внутренней оболочки позволило удалить их прямо между этими «скобками событий», эффективно решая проблему.Спасибо всем за ваше время.

0 голосов
/ 27 мая 2018

Вы упомянули, что указатель содержит указатель на базовый элемент, который уже удален к моменту, когда вы можете использовать QAbstractItemModel средства для уведомления представления об удалении.Поэтому я предполагаю, что вы используете QModelIndex :: internalPointer , чтобы сопоставить понятия строки / столбца / родителя QAbstractItemModel с элементами вашей исходной базовой модели.

Вместо этого вы можете использовать QModelIndex :: internalId , чтобы отобразить элементы из вашей базовой модели в индексы QAbstractItemModel.В отличие от висящего указателя, уникальный идентификатор можно использовать для безопасной проверки того, существует ли элемент в базовой модели в любое время.Если его не существует, всегда можно вернуть пустой QVariant из QAbstractItemModel::data метода.Это может все еще «удивить» представление, поскольку значения некоторых элементов из реальных значений будут меняться на пустые значения за спиной представления, но это все же намного лучше, чем иметь дело с потенциально висящим указателем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...