Как обновить содержимое QTableView
От: Аноним  
Дата: 12.04.13 06:20
Оценка:
Есть QTableView, прикрученные к нему TableModel и TableDelegate, унаследованные от QAbstractTableModel и QItemDelegate соответственно. Модель берет данные из некоторого внешнего источника и отдает в методах rowCount(), columnCount(), data(), headerData(), также поддерживается setData(). Все работает.

В какой-то момент данные во внешнем источнике меняются. Это может быть некое внешнее действие пользователя (например команда из меню приложения) или асинхронное событие, возникшее где-то в глубинах приложения, еще что-то... Например, происходит перестановка двух строк таблицы, или изменение данных сразу во всех ячейках. Нужно заставить QTableView "перерисоваться", объявить все данные (или данные в конкретных строках) "недействительными". Как это сделать?

Нагуглил нечто про protected методы модели beginResetModel(), endResetModel() и reset(); но они работают криво — обновляется только выделенная строка, иногда вообще наблюдаются какие-то глюки с поведением QTableView, да и вообще нелогично — это защищенные методы, пришлось для них писать публичные обертки в классе-наследнике.
Re: Как обновить содержимое QTableView
От: ndev  
Дата: 12.04.13 07:20
Оценка:
Здравствуйте, Аноним, Вы писали:

чтобы обновить таблицу, надо вызвать сигнал dataChanged:

emit dataChanged(...)
Re: Как обновить содержимое QTableView
От: Igore Россия  
Дата: 12.04.13 12:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть 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. Хотя для меня странно как такое может произойти в модели.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.