为什么我不能自动更新线程内的 QTableView 模型?
Why can't I update the QTableView model inside a thread automatically?
简介:
我正在使用 QT5,我想更新 TableView
,其中 TableView
的 model
在线程内更新。
*方法
我像这样创建一个 table 并设置它的列和行。
/* TableView */
QStandardItemModel* looping_terminal_model = new QStandardItemModel(4, 2);
looping_terminal_model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
looping_terminal_model->setHeaderData(1, Qt::Horizontal, QObject::tr("DATA"));
ui->looping_terminal_tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
ui->looping_terminal_tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->looping_terminal_tableView->setModel(looping_terminal_model);
然后我开始线程。
/* Threads */
this->loop_terminal = new Loop_terminal(j1939, &start_loop_terminal_thread, looping_terminal_model);
loop_terminal->start();
loop_terminal
里面class,是这样的
Loop_terminal::Loop_terminal(J1939* j1939, bool* start_loop_terminal_thread, QStandardItemModel* looping_terminal_model){
this->j1939 = j1939;
this->start_loop_terminal_thread = start_loop_terminal_thread;
this->looping_terminal_model = looping_terminal_model;
i = 0;
}
void Loop_terminal::run(){
while(1){
if(j1939->ID_and_data_is_updated){
j1939->ID_and_data_is_updated = false;
}
QModelIndex index = looping_terminal_model->index(1,1,QModelIndex());
// 0 for all data
looping_terminal_model->setData(index,this->i);
i++;
msleep(1000);
}
}
结果
该值可以显示在蓝色单元格中。但它只会在我点击蓝色单元格时更新。
讨论:
问题来了
looping_terminal_model->setData(index,this->i);
每次更新索引时,我都需要按下蓝色的 TableView
单元格,这样它才能更新。否则,什么也不会发生。如果我最小化 window,它会更新,但我看不到。
我应该怎么做才能确保 ui
可以更新,即使它在线程之外?
不,你不能也不应该。视图大量使用模型,因此它们必须与视图存在(和修改)在同一个线程中,因为它们不是线程安全的。解决方案是使用信号将信息发送到主线程,然后更新模型。
简介:
我正在使用 QT5,我想更新 TableView
,其中 TableView
的 model
在线程内更新。
*方法
我像这样创建一个 table 并设置它的列和行。
/* TableView */
QStandardItemModel* looping_terminal_model = new QStandardItemModel(4, 2);
looping_terminal_model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
looping_terminal_model->setHeaderData(1, Qt::Horizontal, QObject::tr("DATA"));
ui->looping_terminal_tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
ui->looping_terminal_tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->looping_terminal_tableView->setModel(looping_terminal_model);
然后我开始线程。
/* Threads */
this->loop_terminal = new Loop_terminal(j1939, &start_loop_terminal_thread, looping_terminal_model);
loop_terminal->start();
loop_terminal
里面class,是这样的
Loop_terminal::Loop_terminal(J1939* j1939, bool* start_loop_terminal_thread, QStandardItemModel* looping_terminal_model){
this->j1939 = j1939;
this->start_loop_terminal_thread = start_loop_terminal_thread;
this->looping_terminal_model = looping_terminal_model;
i = 0;
}
void Loop_terminal::run(){
while(1){
if(j1939->ID_and_data_is_updated){
j1939->ID_and_data_is_updated = false;
}
QModelIndex index = looping_terminal_model->index(1,1,QModelIndex());
// 0 for all data
looping_terminal_model->setData(index,this->i);
i++;
msleep(1000);
}
}
结果
该值可以显示在蓝色单元格中。但它只会在我点击蓝色单元格时更新。
讨论:
问题来了
looping_terminal_model->setData(index,this->i);
每次更新索引时,我都需要按下蓝色的 TableView
单元格,这样它才能更新。否则,什么也不会发生。如果我最小化 window,它会更新,但我看不到。
我应该怎么做才能确保 ui
可以更新,即使它在线程之外?
不,你不能也不应该。视图大量使用模型,因此它们必须与视图存在(和修改)在同一个线程中,因为它们不是线程安全的。解决方案是使用信号将信息发送到主线程,然后更新模型。