2012-02-10 14 views
0

QSqlQueryModelの結果を表示するためにQTableViewを使用しています。 DBのデータは永久に変更されるので、毎回同じスクリプトを実行し、更新されたデータを取得する必要があります。クエリは別のスレッドで実行され、その結果がメインスレッドに返されます。QSqlQueryModelとQSortFilterProxyModelを使用してQTableViewが正しく更新されない

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を使用して並べ替えを導入しようとしたときに問題が発生しました。私がそれをして以来、私のテーブルは更新されたデータを受け取っていません。 DBMSで同じスクリプトを実行しているときに、QSqlQueryModelが更新されたデータを受け取らないことを確認しました。新しい結果が得られます。 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); 

} 
関連する問題