102 lines
3.3 KiB
C++
102 lines
3.3 KiB
C++
#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));
|
||
}
|
||
|