I'm trying to refresh a QTableView
based on data from a method get_data
which is called periodically by QTimer
as below.
Once I get the data, I update it in my model (via a member function refresh
) and then call refresh_table
to hopefully update the tableView
with the current data. However, the call to tableView->update()
(I've also tried tableView->repaint()
) does not work as intended, and tableView
does not update - staying put at its first-call value. Note that my data is liable to change completely, and it's not simply a matter of inserting extra rows.
void MainWindow::DataDisplay(QWidget *tab) {
auto tableView = create_table(tab,...);
auto timer = new QTimer(this);
auto model = new MyModel();
connect(timer, &QTimer::timeout, [tableView, model, this]() {
const auto data = get_data();
model->refresh(data);
refresh_table(model, tableView);
});
timer->start(1000);
}
auto refresh_table(MyModel *model,
QTableView *tableView) {
tableView->setModel(model);
tableView->update(); // does not work
}
What's the canonical way of refreshing one's model in Qt
such that the associated TableView
is updated?
CodePudding user response:
The canonical way is for your model to emit a dataChanged() signal. Any associated QTableViews will receive that signal and respond by re-querying the model for new values and updating the associated cells of their table.