PowerModeler/source/tableEditModel.cpp

102 lines
3.3 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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