diff --git a/src/sql/models/qsqlquerymodel.cpp b/src/sql/models/qsqlquerymodel.cpp index 1aae088c64a..fb338d16dfa 100644 --- a/src/sql/models/qsqlquerymodel.cpp +++ b/src/sql/models/qsqlquerymodel.cpp @@ -469,6 +469,35 @@ void QSqlQueryModel::setQuery(const QString &query, const QSqlDatabase &db) setQuery(QSqlQuery(query, db)); } +/*! + \since 6.9 + Re-executes the current query to fetch the data from the same database connection. + + \note \c refreshQuery() is not applicable when the query contains bound values. + + \sa setQuery(QSqlQuery &&query), QSqlQuery::boundValue() +*/ +void QSqlQueryModel::refreshQuery() +{ + Q_D(QSqlQueryModel); + setQuery(d->query.executedQuery()); +} + +/*! + \overload + \since 6.9 + Re-executes the current query to fetch the data from the given database connection \a db. + + \note \c refreshQuery(const QSqlDatabase &db) is not applicable when the query contains bound values. + + \sa setQuery(const QString &query, const QSqlDatabase &db), QSqlQuery::boundValue() +*/ +void QSqlQueryModel::refreshQuery(const QSqlDatabase &db) +{ + Q_D(QSqlQueryModel); + setQuery(d->query.executedQuery(), db); +} + /*! Clears the model and releases any acquired resource. */ diff --git a/src/sql/models/qsqlquerymodel.h b/src/sql/models/qsqlquerymodel.h index 73308b79e84..f9fddbb9752 100644 --- a/src/sql/models/qsqlquerymodel.h +++ b/src/sql/models/qsqlquerymodel.h @@ -46,6 +46,8 @@ public: #endif void setQuery(QSqlQuery &&query); void setQuery(const QString &query, const QSqlDatabase &db = QSqlDatabase()); + void refreshQuery(); + void refreshQuery(const QSqlDatabase &db); #if QT_SQL_REMOVED_SINCE(6, 5) QSqlQuery query() const; #endif diff --git a/tests/auto/sql/models/qsqlquerymodel/tst_qsqlquerymodel.cpp b/tests/auto/sql/models/qsqlquerymodel/tst_qsqlquerymodel.cpp index eeafef15fa9..dbe1f998cf2 100644 --- a/tests/auto/sql/models/qsqlquerymodel/tst_qsqlquerymodel.cpp +++ b/tests/auto/sql/models/qsqlquerymodel/tst_qsqlquerymodel.cpp @@ -59,7 +59,10 @@ private slots: void task_180617(); void task_180617_data() { generic_data(); } void task_QTBUG_4963_setHeaderDataWithProxyModel(); - + void refreshQuery_data() { generic_data(); } + void refreshQuery(); + void refreshQueryWithBoundValues_data() { generic_data(); } + void refreshQueryWithBoundValues(); private: void generic_data(const QString &engine = QString()); void dropTestTables(const QSqlDatabase &db); @@ -660,5 +663,59 @@ void tst_QSqlQueryModel::task_QTBUG_4963_setHeaderDataWithProxyModel() // And it should not crash. } +void tst_QSqlQueryModel::refreshQuery() +{ + QFETCH(QString, dbName); + QSqlDatabase db = QSqlDatabase::database(dbName); + QSqlQueryModel model; + + model.setQuery("SELECT * FROM " + qTableName("test", __FILE__, db), db); + QCOMPARE(model.rowCount(), 2); + QCOMPARE(model.data(model.index(0, 0)).toInt(), 1); + QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry")); + QCOMPARE(model.data(model.index(0, 2)).toInt(), 1); + + QSqlQuery(db).exec("UPDATE " + qTableName("test", __FILE__, QSqlDatabase::database(dbName)) + + " SET name = 'updated_harry' WHERE id = 1"); + model.refreshQuery(db); + QCOMPARE(model.rowCount(), 2); + QCOMPARE(model.data(model.index(0, 0)).toInt(), 1); + QCOMPARE(model.data(model.index(0, 1)).toString(), QString("updated_harry")); + QCOMPARE(model.data(model.index(0, 2)).toInt(), 1); + + // Resetting the name to "harry" in the table + QSqlQuery(db).exec("UPDATE " + qTableName("test", __FILE__, QSqlDatabase::database(dbName)) + + " SET name = 'harry' WHERE id = 1"); +} + +void tst_QSqlQueryModel::refreshQueryWithBoundValues() +{ + QFETCH(QString, dbName); + QSqlDatabase db = QSqlDatabase::database(dbName); + QSqlQueryModel model; + + QSqlQuery query(db); + query.prepare("SELECT name FROM " + qTableName("test", __FILE__, db) + " WHERE id = :id"); + query.bindValue(":id", 1); + query.exec(); + model.setQuery(query); + + QCOMPARE(model.rowCount(), 1); + QCOMPARE(model.data(model.index(0, 0)).toString(), QString("harry")); + + QSqlQuery(db).exec("UPDATE " + qTableName("test", __FILE__, QSqlDatabase::database(dbName)) + + " SET name = 'updated_harry' WHERE id = 1"); + model.refreshQuery(db); + QCOMPARE(model.rowCount(), 0); + QCOMPARE_NE(model.data(model.index(0, 0)).toString(), QString("updated_harry")); + QCOMPARE(model.data(model.index(0, 0)).toString(), QString("")); + + // Resetting the name to "harry" in the table + QSqlQuery(db).exec("UPDATE " + qTableName("test", __FILE__, QSqlDatabase::database(dbName)) + + " SET name = 'harry' WHERE id = 1"); +} + + + QTEST_MAIN(tst_QSqlQueryModel) #include "tst_qsqlquerymodel.moc"