PowerModeler/source/tableEditModel.cpp

102 lines
3.3 KiB
C++
Raw Normal View History

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