QTableView未正确更新使用QSqlQueryModel和QSortFilterProxyModel

我正在使用QTableView为了显示QSqlQueryModel的结果。数据库中的数据会永久更改,因此我每次都运行相同的脚本并需要获取更新的数据。该查询在另一个线程中执行,然后将结果返回给主线程。QTableView未正确更新使用QSqlQueryModel和QSortFilterProxyModel

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);

}

以上是 QTableView未正确更新使用QSqlQueryModel和QSortFilterProxyModel 的全部内容, 来源链接: utcz.com/qa/259194.html

回到顶部