diff options
author | Mark Brand <mabrand@mabrand.nl> | 2012-02-09 14:53:35 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-02-15 02:36:07 +0100 |
commit | 2ecdb8c091cbfdc2b4f81c90828fb61b96c565fe (patch) | |
tree | d642200ceda4aa067420667026b20a375abca7a2 /src/sql/models | |
parent | 980947122307797e1d8da03f768d8f14a360d20b (diff) |
QSql*Model: make indexInQuery() virtual
Qt 5 seems like an excellent opportunity to simplify logic and separate
concerns by making indexInQuery() virtual. Note that this wasn't my
idea, but was mentioned in a helpful comment.
Change-Id: Ie29ead110def45297c32de3ce6d07a8eefb08d8c
Reviewed-by: Yunqiao Yin <charles.yin@nokia.com>
Diffstat (limited to 'src/sql/models')
-rw-r--r-- | src/sql/models/qsqlquerymodel.h | 2 | ||||
-rw-r--r-- | src/sql/models/qsqltablemodel.cpp | 26 |
2 files changed, 10 insertions, 18 deletions
diff --git a/src/sql/models/qsqlquerymodel.h b/src/sql/models/qsqlquerymodel.h index 7db973b0d4..b5e1a7a746 100644 --- a/src/sql/models/qsqlquerymodel.h +++ b/src/sql/models/qsqlquerymodel.h @@ -92,7 +92,7 @@ public: protected: virtual void queryChange(); - QModelIndex indexInQuery(const QModelIndex &item) const; + virtual QModelIndex indexInQuery(const QModelIndex &item) const; void setLastError(const QSqlError &error); QSqlQueryModel(QSqlQueryModelPrivate &dd, QObject *parent = 0); }; diff --git a/src/sql/models/qsqltablemodel.cpp b/src/sql/models/qsqltablemodel.cpp index 29f29bac0d..ab87397da5 100644 --- a/src/sql/models/qsqltablemodel.cpp +++ b/src/sql/models/qsqltablemodel.cpp @@ -384,12 +384,6 @@ QVariant QSqlTableModel::data(const QModelIndex &index, int role) const if (!index.isValid() || (role != Qt::DisplayRole && role != Qt::EditRole)) return QVariant(); - // Problem.. we need to use QSQM::indexInQuery to handle inserted columns - // but inserted rows we need to handle - // and indexInQuery is not virtual (grrr) so any values we pass to QSQM need - // to handle the insertedRows - QModelIndex item = indexInQuery(index); - if (d->cache.contains(index.row())) { const QSqlTableModelPrivate::ModifiedRow row = d->cache.value(index.row()); @@ -397,25 +391,24 @@ QVariant QSqlTableModel::data(const QModelIndex &index, int role) const case OnFieldChange: case OnRowChange: if (row.op() == QSqlTableModelPrivate::Insert) { - if (item.column() < 0 || item.column() >= row.rec().count()) + if (index.column() < 0 || index.column() >= row.rec().count()) return QVariant(); - return row.rec().value(item.column()); + return row.rec().value(index.column()); } else if (row.op() == QSqlTableModelPrivate::Update) { - if (row.rec().isGenerated(item.column())) - return row.rec().value(item.column()); + if (row.rec().isGenerated(index.column())) + return row.rec().value(index.column()); } break; case OnManualSubmit: if (row.op() == QSqlTableModelPrivate::Insert || (row.op() != QSqlTableModelPrivate::None - && row.rec().isGenerated(item.column()))) - return row.rec().value(item.column()); + && row.rec().isGenerated(index.column()))) + return row.rec().value(index.column()); break; } } - // We need to handle row mapping here, but not column mapping - return QSqlQueryModel::data(index.sibling(item.row(), index.column()), role); + return QSqlQueryModel::data(index, role); } /*! @@ -1122,15 +1115,14 @@ int QSqlTableModel::rowCount(const QModelIndex &parent) const QModelIndex QSqlTableModel::indexInQuery(const QModelIndex &item) const { Q_D(const QSqlTableModel); - const QModelIndex it = QSqlQueryModel::indexInQuery(item); // this adjusts columns only int rowOffset = 0; QSqlTableModelPrivate::CacheMap::ConstIterator i = d->cache.constBegin(); - while (i != d->cache.constEnd() && i.key() <= it.row()) { + while (i != d->cache.constEnd() && i.key() <= item.row()) { if (i.value().op() == QSqlTableModelPrivate::Insert) ++rowOffset; ++i; } - return createIndex(it.row() - rowOffset, it.column(), it.internalPointer()); + return QSqlQueryModel::indexInQuery(createIndex(item.row() - rowOffset, item.column(), item.internalPointer())); } /*! |