Qt 5.2 Model-View-Pattern: Как сообщить объекту модели об изменениях в базовой структуре данных
У меня есть класс, используемый для постоянного хранения некоторых элементов, которые организованы в виде таблицы. Этот класс абсолютно не связан с Qt и поступает из другой библиотеки. Давайте назовем этот классDataContainer
для остальной части этого вопроса. Он предоставляет std-c ++ совместимые итераторы для доступа и управления контентом.
Мне нужно отобразить и изменить эти данные через графический интерфейс Qt. Моя идея состояла в том, чтобы создать классDataContainerQtAdaptor
что наследует отQAbstractTableModel
и сохраняет указатель наDataContainer
объект.DataContainerQtAdaptor
служит адаптером дляDataContainer
объект и все манипуляции внутри моего приложения Qt выполняются через этот адаптер. Тогда я используюQTableView
виджет для отображения информации.
К сожалениюDataContainer
может быть изменено потоками / процессами. (Например, подумайте оDataContainer
как некоторый класс C ++, который инкапсулирует соединение с базой данных, и эта база данных может быть изменена кем-то другим.)
Вопросов:
1) Предположим, у меня есть функция, которая вызывается каждый раз, когда внутренняя структураDataContainer
объект был изменен. Какова правильная функцияQAbstractTableModel
что должно быть вызвано для информирования модели об основных изменениях? Мне нужно что-то вроде «Уважаемая модель, ваш постоянный сервер хранения изменился. Пожалуйста, обновите себя и подайте сигнал каждому приложенному представлению, чтобы отразить это изменение».
2) Допустим, 1) решено. Каков наилучший способ избежать «двойного» обновления графического интерфейса в случае, если изменение было инициировано через графический интерфейс? Например: пользователь нажимает на ячейку в виджете таблицы -> вызовы виджета таблицыsetData
модели -> модель толкает изменение к бэкэнду -> бэкэнд запускает свою собственную функцию "onUpdate" -> модель перечитывает полный бэкэнд (хотя уже знает об изменении) -> графический интерфейс обновляется второй раз
3) Пользователь должен иметь возможность вставлять новые строки / столбцы через графический интерфейс и помещать в него данные. Но позиция определяется этими данными, потому что серверная часть сохраняет данные отсортированными. Следовательно, у меня есть следующая проблема: пользователь решает создать новую строку в конце, и новые данные помещаются в серверную часть. Когда бэкэнд / модель перечитывается, эти данные обычно находятся не в последней позиции, а вставляются где-то посередине, а все остальные данные перемещаются вперед. Как мне синхронизировать все свойства виджета табличного представления, такие как «выбор ячейки»?
Я считаю, что должно быть какое-то простое стандартное решение для всех этих вопросов, потому что это так же, какQFileSystemModel
работает. Пользователь выбирает файл, а другой процесс создает новый файл. Новый файл отображается в представлении, и все последующие строки перемещаются вперед. Выбор тоже движется вперед.
Матиас