[Solved] The "best" way to programmatically refresh a QSqlQueryModel when the content of the query changes
-
I think you'll have to stick to the setQuery method. At first, you say that the query would change because of some external event. Then why is it weird that you have to set it again? It is not refreshing if the query itself has changed, is it?
How much that costs, would depend on your db engine I think. It may - I am not sure here - also depend on how you set your query. If you use setQuery (QSqlQuery) and bind the arguments that will change, your database may be able to optimize and not parse the SQL again. If not, using a view in your database could help too. -
I would also guess that the performance impact very much depends on how the Qt database driver is implemented and the internals of the database itself.
I also agree that setQuery typically should not have a huge performance impact but why should this not be encapsulated in the Qt model itself. In my impression a simple public refresh method just seems to be missing.
To give a an example I use the situation I came across when issuing this message.
I use a rather complex SQL query to an Oracle Database to retrieve data that will be used in a graph.
The graph will be updated every second using a timer with the latest data and update the graph.
The columns and the query are constant and I would only like to "refresh" the data will the latest values. -
QSqlTableModel::select() use setQuery( QString, QSqlDatabase ) method refresh contents. I guess you could do it the same way.
-
Hi all
I have similar question I am use QTableView + QSqlQuery when I set query at first time I allow fetch only first 10 rows from query, after that according user decides I can fetch next few rows, but my QTableView is not refreshed after fetch. I can't use setQuery because I do not what run sql yet one time to get result that I already have.
I try to use something like this
@emit dataChanged(createIndex(OldRowCnt, 1), createIndex(RowCount, HeaderCount));@
but this has no resultthank you for future help )
-
beginInsertRows solve my problem, I am call it after fetch
@bool cOciQModel::fetch(int Cnt, bool SilentMode) {
if (RowCount && !query->seek(RowCount - 1)) {
LastError = QString("Can't goto [%1] position").arg(QString::number(RowCount - 1));
return false;
}
int OldRowCnt = RowCount;
int Count = Cnt + 1;
while (--Count && !AllDataFetched) {
AllDataFetched = !query->next();
if (!AllDataFetched) {
++RowCount;
}
}if (!SilentMode) {
beginInsertRows(QModelIndex(), OldRowCnt, RowCount);
endInsertRows();
}return true;
}@
-
@iamantony how to do it with Python?
-
@Gelo Replace -> with .
-
@Gelo Yes, it is C++.
QString is a Qt data type for strings - no need to write it in Python.