173 lines
5.0 KiB
C++
173 lines
5.0 KiB
C++
#include "attributeTableModel.h"
|
||
#include "logger.h"
|
||
#include "sqlQueryExecutor.h"
|
||
|
||
AttributeTableModel::AttributeTableModel(QObject* parent, const QString& connection, const QString& modelID, const QString& groupID, const QString& tableName)
|
||
: QAbstractTableModel(parent)
|
||
, m_connection(connection)
|
||
, m_modelID(modelID)
|
||
, m_groupID(groupID)
|
||
, m_tableName(tableName)
|
||
{
|
||
m_pageSize = 100;
|
||
m_currentPage = 1;
|
||
m_totalCount = 0;
|
||
|
||
m_visibleColumns << "attribute" << "attribute_name" << "data_type_id" << "length_precision" << "default_value";
|
||
}
|
||
|
||
AttributeTableModel::~AttributeTableModel()
|
||
{}
|
||
|
||
QVariant AttributeTableModel::data(const QModelIndex& index, int role) const
|
||
{
|
||
if(!index.isValid())
|
||
return QVariant();
|
||
|
||
int row = index.row();
|
||
int col = index.column();
|
||
int globalRow = (m_currentPage - 1) * m_pageSize + row;
|
||
|
||
if(index.column() == 0) //第一列显示行号
|
||
{
|
||
switch (role)
|
||
{
|
||
case Qt::DisplayRole:
|
||
{
|
||
QString prefix;
|
||
if(m_modifiedRows.contains(globalRow))
|
||
{
|
||
switch(m_modifiedRows[globalRow].state)
|
||
{
|
||
case Modified:
|
||
prefix = "*";
|
||
break;
|
||
case New:
|
||
prefix = "+";
|
||
break;
|
||
case Deleted:
|
||
prefix = "-";
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
return prefix + QString::number(globalRow + 1);
|
||
}
|
||
case Qt::DecorationRole:
|
||
return QVariant();
|
||
case Qt::TextAlignmentRole:
|
||
return Qt::AlignCenter; //行号居中展示
|
||
default:
|
||
return QVariant();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
int dataCol = col - 1;
|
||
const RowData& rowData = m_currentPageData[row];
|
||
if (role == Qt::DisplayRole || role == Qt::EditRole)
|
||
return rowData.record.value(dataCol);
|
||
else if (role == Qt::UserRole + 100) //以100来标识数据是否被编辑,在相关代理Delegate类实现中同步进行处理(文字加粗等效果)
|
||
return (rowData.state != Clean);
|
||
}
|
||
|
||
return QVariant();
|
||
}
|
||
|
||
bool AttributeTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
|
||
{
|
||
if (role != Qt::EditRole || index.column() == 0)
|
||
return false;
|
||
|
||
int row = index.row();
|
||
int globalRow = (m_currentPage - 1) * m_pageSize + row;
|
||
int dataCol = index.column() - 1; //第一列显示了行号
|
||
//记录修改
|
||
RowData modifiedRow = m_currentPageData[row];
|
||
modifiedRow.record.setValue(dataCol, value);
|
||
modifiedRow.state = (modifiedRow.state == New) ? New : Modified;
|
||
|
||
m_modifiedRows[globalRow] = modifiedRow;
|
||
m_currentPageData[row] = modifiedRow;
|
||
|
||
emit dataChanged(index, index, {role, Qt::UserRole + 100});
|
||
return true;
|
||
}
|
||
|
||
QVariant AttributeTableModel::headerData(int section, Qt::Orientation orientation, int role) const
|
||
{
|
||
if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
|
||
{
|
||
if(section == 0)
|
||
return role == Qt::DisplayRole ? "No." : QVariant();
|
||
else
|
||
{
|
||
return m_visibleColumns.value(section);
|
||
}
|
||
}
|
||
return QAbstractTableModel::headerData(section, orientation, role);
|
||
}
|
||
|
||
int AttributeTableModel::rowCount(const QModelIndex& parent) const
|
||
{
|
||
return m_currentPageData.count();
|
||
}
|
||
|
||
int AttributeTableModel::columnCount(const QModelIndex &) const
|
||
{
|
||
return m_visibleColumns.isEmpty() ? 0 : m_visibleColumns.count() + 1;
|
||
}
|
||
|
||
Qt::ItemFlags AttributeTableModel::flags(const QModelIndex &index) const
|
||
{
|
||
Qt::ItemFlags flags = QAbstractTableModel::flags(index);
|
||
if (index.column() != 0) //行号列不能编辑
|
||
flags = flags | Qt::ItemIsEditable;
|
||
return flags;
|
||
}
|
||
|
||
void AttributeTableModel::loadPageData()
|
||
{
|
||
if (m_tableName.isEmpty())
|
||
{
|
||
LOG_ERROR("DB", QString("Attribute table name is empty, load data failed"));
|
||
return;
|
||
}
|
||
|
||
beginResetModel();
|
||
|
||
QString strSQL = QString("SELECT %1 FROM %2 LIMIT %3 OFFSET %4")
|
||
.arg(m_visibleColumns.join(", "))
|
||
.arg(m_tableName)
|
||
.arg(m_pageSize)
|
||
.arg((m_currentPage - 1) * m_pageSize);
|
||
try
|
||
{
|
||
QSqlQuery query = SqlQueryExecutor::instance().executeSQL(m_connection, strSQL);
|
||
while(query.next())
|
||
{
|
||
RowData data;
|
||
data.record = query.record();
|
||
m_currentPageData.append(data);
|
||
}
|
||
}
|
||
catch (const DatabaseException& e)
|
||
{
|
||
LOG_ERROR("SQL", QString::fromWCharArray(L"获取属性信息失败。modelID:%1, groupID:%2").arg(m_modelID, m_groupID));
|
||
}
|
||
|
||
endResetModel();
|
||
}
|
||
|
||
void AttributeTableModel::updateTotalCount()
|
||
{
|
||
if (m_tableName.isEmpty())
|
||
{
|
||
LOG_ERROR("SQL", QString::fromWCharArray(L"属性表名称为空,获取属性数量失败"));
|
||
return;
|
||
}
|
||
|
||
m_totalCount = SqlQueryExecutor::instance().getAttributeCount(m_connection, m_tableName);
|
||
}
|