2012-02-10 98 views
0

我正在使用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,表格會正常更新。

回答

0

我不知道你的代碼的其餘部分,但這可能會有所幫助。

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

}