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));
|
|||
|
|
}
|
|||
|
|
|