summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/sql/models/qsqltablemodel.cpp43
-rw-r--r--src/sql/models/qsqltablemodel.h1
-rw-r--r--src/sql/models/qsqltablemodel_p.h14
3 files changed, 58 insertions, 0 deletions
diff --git a/src/sql/models/qsqltablemodel.cpp b/src/sql/models/qsqltablemodel.cpp
index 9ade5f14d5..40230c3043 100644
--- a/src/sql/models/qsqltablemodel.cpp
+++ b/src/sql/models/qsqltablemodel.cpp
@@ -392,6 +392,49 @@ bool QSqlTableModel::select()
}
/*!
+ Refreshes \a row in the model with values from the database table row matching
+ on primary key values. Without a primary key, all column values must match. If
+ no matching row is found, the model will show an empty row.
+
+ Returns true if successful; otherwise returns false.
+
+ \sa select()
+*/
+bool QSqlTableModel::selectRow(int row)
+{
+ Q_D(QSqlTableModel);
+
+ if (row < 0 || row >= rowCount())
+ return false;
+
+ const int table_sort_col = d->sortColumn;
+ d->sortColumn = -1;
+ const QString table_filter = d->filter;
+ d->filter = d->db.driver()->sqlStatement(QSqlDriver::WhereStatement,
+ d->tableName,
+ d->primaryValues(row),
+ false);
+ if (d->filter.startsWith(QLatin1String("WHERE "), Qt::CaseInsensitive))
+ d->filter.remove(0, 6);
+ const QString stmt = selectStatement();
+ d->sortColumn = table_sort_col;
+ d->filter = table_filter;
+
+ QSqlQuery q(d->db);
+ q.setForwardOnly(true);
+ if (!q.exec(stmt))
+ return false;
+
+ bool exists = q.next();
+ d->cache[row].refresh(exists, q.record());
+
+ emit headerDataChanged(Qt::Vertical, row, row);
+ emit dataChanged(createIndex(row, 0), createIndex(row, columnCount() - 1));
+
+ return true;
+}
+
+/*!
\reimp
*/
QVariant QSqlTableModel::data(const QModelIndex &index, int role) const
diff --git a/src/sql/models/qsqltablemodel.h b/src/sql/models/qsqltablemodel.h
index 38e92200c7..13316bc4ed 100644
--- a/src/sql/models/qsqltablemodel.h
+++ b/src/sql/models/qsqltablemodel.h
@@ -67,6 +67,7 @@ public:
virtual ~QSqlTableModel();
virtual bool select();
+ virtual bool selectRow(int row);
virtual void setTable(const QString &tableName);
QString tableName() const;
diff --git a/src/sql/models/qsqltablemodel_p.h b/src/sql/models/qsqltablemodel_p.h
index ba2fdf5df3..323964afe8 100644
--- a/src/sql/models/qsqltablemodel_p.h
+++ b/src/sql/models/qsqltablemodel_p.h
@@ -135,6 +135,20 @@ public:
setGenerated(m_db_values, true);
}
}
+ inline void refresh(bool exists, const QSqlRecord& newvals)
+ {
+ m_submitted = true;
+ if (exists) {
+ m_op = Update;
+ m_db_values = newvals;
+ m_rec = newvals;
+ setGenerated(m_rec, false);
+ } else {
+ m_op = Delete;
+ m_rec.clear();
+ m_db_values.clear();
+ }
+ }
inline bool insert() const { return m_insert; }
inline void revert()
{