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 работает. Пользователь выбирает файл, а другой процесс создает новый файл. Новый файл отображается в представлении, и все последующие строки перемещаются вперед. Выбор тоже движется вперед.

Матиас

Ответы на вопрос(2)

Ваш ответ на вопрос