#include "tableEditModel.h" TableEditModel::TableEditModel(QObject *parent, const QSqlDatabase &db, const QStringList &visibleColumns) : QSqlTableModel(parent, db), m_visibleColumns(visibleColumns) { setEditStrategy(QSqlTableModel::OnManualSubmit); //对编辑数据手动进行提交 m_pageSize = 100; m_currentPage = 1; m_totalRecords = 0; } TableEditModel::~TableEditModel() {} //重写生成查询的方法 QString TableEditModel::selectStatement() const { QString originalQuery = QSqlTableModel::selectStatement(); QString newQuery; if(m_visibleColumns.isEmpty()) newQuery = originalQuery; else { int fromInex = originalQuery.indexOf(" FROM "); QString selectPart = "SELECT " + m_visibleColumns.join(", "); newQuery = selectPart + originalQuery + selectPart.mid(fromInex); } newQuery = newQuery + QString(" LIMIT %1 OFFSET %2").arg(m_pageSize, (m_currentPage - 1) * m_pageSize); return newQuery; } QVariant TableEditModel::data(const QModelIndex& index, int role) const { if(!index.isValid()) return QVariant(); if(index.column() == 0) //第一列显示行号 { int golbalRow = (m_currentPage - 1) * m_pageSize + index.row(); switch (role) { case Qt::DisplayRole: { QString displayRow = QString::number(golbalRow + 1); if(m_editCache.keys().contains(index.row())) displayRow = "*" + displayRow; return displayRow; } case Qt::DecorationRole: return QVariant(); case Qt::TextAlignmentRole: //行号居中展示 return Qt::AlignCenter; default: return QVariant(); } } else if(role == Qt::UserRole + 100) //先以100来标识数据是否被编辑,在相关代理Delegate类实现中同步进行处理(文字加粗等效果) return isDirty(index); else return QSqlTableModel::data(createIndex(index.row(), index.column() - 1), role); //因为第一列显示行号,所以其它数据列要错位展示 } bool TableEditModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (!index.isValid() || index.column() == 0 || role != Qt::EditRole) //忽略行号列 return false; // if(index.column() == 0) //忽略行号列 // return QSqlTableModel::setData(createIndex(index.row(), index.column()-1), value, role); int row = index.row(); if (row < 0 || row >= rowCount()) return false; //记录修改到缓存 if(!m_editCache.contains(row)) { EditRecord record; record.original = QSqlTableModel::record(row); m_editCache[row] = record; } m_editCache[row].modified.setValue(index.column() - 1, value); emit dataChanged(index, index, {role}); return true; } int TableEditModel::columnCount(const QModelIndex &parent) const { return QSqlTableModel::columnCount(parent) + 1; // 原始列数 + 行号列 } Qt::ItemFlags TableEditModel::flags(const QModelIndex &index) const { if(index.column() == 0) //行号列不可编辑 return Qt::ItemIsEnabled | Qt::ItemIsSelectable; else return QSqlTableModel::flags(this->index(index.row(), index.column() - 1)); }