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