Как правильно обновить QTableView с помощью таймера?

Я использую C++, Qt 4.8.5, Visual Studio 2010, SQLite. У меня есть приложение с графическим интерфейсом на основе Qt, которое содержит QTableView. Программа анализирует некоторые данные и изменяет некоторые ячейки без добавления/удаления строк. Я использую QTimer для обновления QTableView в режиме OnManualSubmit. Безопасно ли вызывать метод submitAll() в слоте таймера для модели несколько раз, даже если модификаций нет? Если submitAll() терпит неудачу, то должен ли я вручную вызывать метод select() моей модели? А как насчет выборки строк для SQLite - она ​​мне нужна после вызова submitAll(), чтобы смотреть изменения ячеек в 257-й и последующих строках?

Иногда у меня появляется последняя ошибка типа "Несоответствие количества параметров" (QSqlError::StatementError) после второго вызова 'submitAll()'. Какова возможная причина? Программа многопоточная, рабочие потоки отправляют данные в основной поток. Таймер срабатывает каждые 3 секунды (изменения буферизуются). Это вместо мгновенного обновления ячейки в QTableView.


person ilya    schedule 24.02.2014    source источник


Ответы (1)


Вы не должны обновлять свое представление напрямую (или по таймеру - это большие накладные расходы). Вы должны вызывать emit dataChanged( ... ); при каждом изменении данных в модели. Но если вам нужен грязный хак, вы можете просто вызвать (из модели) 'emit dataChanged(QModelIndex(), QModelIndex());' когда вам нужно обновить свой вид.

person Dmitry Sazonov    schedule 24.02.2014
comment
Программа многопоточная, рабочие потоки отправляют данные в основной поток для отображения. Немедленное отображение каждого крошечного обновления ячейки не делает графический интерфейс отзывчивым, поэтому мне пришлось переключиться в ручной режим отправки. - person ilya; 24.02.2014
comment
Многопоточность не влияет на производительность пользовательского интерфейса. Это увеличивает его. Просто введите в свою ячейку необходимые данные (из любого потока) и вызовите emit dataChanged(). Вы должны проанализировать свой код на наличие проблем с производительностью, если они у вас есть. - person Dmitry Sazonov; 24.02.2014