QTableView未使用QSqlQueryModel和QSortFilterProxyModel正确更新

QTableView not properly updated using QSqlQueryModel and QSortFilterProxyModel

本文关键字:更新 QSortFilterProxyModel 未使用 QSqlQueryModel QTableView      更新时间:2023-10-16

我使用QTableView来显示QSqlQueryModel的结果。DB中的数据是永久更改的,所以我每次都运行相同的脚本,需要获得更新的数据。查询在另一个线程中执行,然后将结果返回到主线程。

void SqlThread::setNewScript(QString script)
{
    QSqlQueryModel * sqlModel = new QSqlQueryModel();
    this->script = script;
    QSqlQuery query = QSqlQuery(this->script, db);
    sqlModel->setQuery(query);
    emit queryFinished(sqlModel);
}
void myTable::onQueryFinished(QSqlQueryModel * model)
{
    QAbstractItemModel * oldModel = this->table->model();
    QSortFilterProxyModel * sort = new QSortFilterProxyModel();
    sort->setSourceModel(model);
    this->table->setModel(sort);
    delete oldModel;
}

当我尝试使用QSortFilterProxyModel引入排序时,问题就出现了。自从我这么做之后,我的表就没有收到任何更新的数据。我检查了QSqlQueryModel没有收到任何更新的数据,而在DBMS中运行相同的脚本会给我新的结果。如果我不使用QSortFilterProxyModel,表将正常更新。

我不知道您的其余代码,但这可能会有所帮助。

    void SqlThread::setNewScript(QString script)
        {
            //QSqlQueryModel * sqlModel = new QSqlQueryModel();
            //It's better to implement your model as [QSortFilterSqlQueryModel][1]
            QSortFilterSqlQueryModel * sqlModel = new QSortFilterSqlQueryModel();
            this->script = script;
            QSqlQuery query = QSqlQuery(this->script, db);
            sqlModel->setQuery(query);
            //use select to start query
            sqlModel->select();
            emit queryFinished(sqlModel);
        }
  /*
      void myTable::onQueryFinished(QSqlQueryModel * model)
        {
            QAbstractItemModel * oldModel = this->table->model();
            QSortFilterProxyModel * sort = new QSortFilterProxyModel();
            sort->setSourceModel(model);
            this->table->setModel(sort);
            delete oldModel;
        }
rest of can be corrected like that if you really wanna pass model to 
the slot(this does not seems to be good idea as your model is already on the heap)*/
void myTable::onQueryFinished(QSortFilterSqlQueryModel * model)
{
            table->setModel(model)
            table->setSelectionMode(QAbstractItemView::SingleSelection);//other option(s) you like
            table->setSortingEnabled(true);
}