Есть QTableView, прикрученные к нему TableModel и TableDelegate, унаследованные от QAbstractTableModel и QItemDelegate соответственно. Модель берет данные из некоторого внешнего источника и отдает в методах rowCount(), columnCount(), data(), headerData(), также поддерживается setData(). Все работает.
В какой-то момент данные во внешнем источнике меняются. Это может быть некое внешнее действие пользователя (например команда из меню приложения) или асинхронное событие, возникшее где-то в глубинах приложения, еще что-то... Например, происходит перестановка двух строк таблицы, или изменение данных сразу во всех ячейках. Нужно заставить QTableView "перерисоваться", объявить все данные (или данные в конкретных строках) "недействительными". Как это сделать?
Нагуглил нечто про protected методы модели beginResetModel(), endResetModel() и reset(); но они работают криво — обновляется только выделенная строка, иногда вообще наблюдаются какие-то глюки с поведением QTableView, да и вообще нелогично — это защищенные методы, пришлось для них писать публичные обертки в классе-наследнике.
Здравствуйте, Аноним, Вы писали:
А>Есть QTableView, прикрученные к нему TableModel и TableDelegate, унаследованные от QAbstractTableModel и QItemDelegate соответственно. Модель берет данные из некоторого внешнего источника и отдает в методах rowCount(), columnCount(), data(), headerData(), также поддерживается setData(). Все работает.
А>В какой-то момент данные во внешнем источнике меняются. Это может быть некое внешнее действие пользователя (например команда из меню приложения) или асинхронное событие, возникшее где-то в глубинах приложения, еще что-то... Например, происходит перестановка двух строк таблицы, или изменение данных сразу во всех ячейках. Нужно заставить QTableView "перерисоваться", объявить все данные (или данные в конкретных строках) "недействительными". Как это сделать?
А>Нагуглил нечто про protected методы модели beginResetModel(), endResetModel() и reset(); но они работают криво — обновляется только выделенная строка, иногда вообще наблюдаются какие-то глюки с поведением QTableView, да и вообще нелогично — это защищенные методы, пришлось для них писать публичные обертки в классе-наследнике.
Для меня нелогично делать эти методы публичными. Не надо менять данные модели снаружи модели. Если данные в модели меняются то во время изменения уведомить подключенные view можно через emit dataChanged(), beginInserRow/endInsertRow, beginDeleteRow/endDeleteRow. beginResetModel/endResetModel нужно при полном изменении данных модели(так будет быстрее). При перестановке двух столбцов beginMoveColumns/endMoveColumns. Хотя для меня странно как такое может произойти в модели.