为什么我不能自动更新线程内的 QTableView 模型?

Why can't I update the QTableView model inside a thread automatically?

简介:

我正在使用 QT5,我想更新 TableView,其中 TableViewmodel 在线程内更新。

*方法

我像这样创建一个 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 可以更新,即使它在线程之外?

不,你不能也不应该。视图大量使用模型,因此它们必须与视图存在(和修改)在同一个线程中,因为它们不是线程安全的。解决方案是使用信号将信息发送到主线程,然后更新模型。