QTableView не обновляется должным образом с использованием QSqlQueryModel и QSortFilterProxyModel - PullRequest
0 голосов
/ 10 февраля 2012

Я использую QTableView для отображения результатов QSqlQueryModel.Данные в БД постоянно меняются, поэтому я каждый раз запускаю один и тот же скрипт и мне нужно получать обновленные данные.Запрос выполняется в другом потоке, после чего он возвращает результат в основной поток.

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 не получает обновленных данных, хотя выполнение того же скрипта в СУБД дает мне новые результаты.Если я не использую QSortFilterProxyModel, таблица обновляется нормально.

1 Ответ

0 голосов
/ 10 февраля 2012

Я не знаю остальную часть вашего кода, но это может помочь.

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

}
...