2025-03-24 18:13:06 +08:00
|
|
|
|
#include "attributeTableModel.h"
|
|
|
|
|
|
#include "logger.h"
|
|
|
|
|
|
#include "sqlQueryExecutor.h"
|
|
|
|
|
|
|
2025-03-25 17:58:48 +08:00
|
|
|
|
AttributeTableModel::AttributeTableModel(const ModelAttributeGroup& modelAttributeGroup, QObject* parent, const QString& connection, const QString& tableName)
|
2025-03-24 18:13:06 +08:00
|
|
|
|
: QAbstractTableModel(parent)
|
|
|
|
|
|
, m_connection(connection)
|
|
|
|
|
|
, m_tableName(tableName)
|
2025-03-25 17:58:48 +08:00
|
|
|
|
, m_modelAttributeGroup(modelAttributeGroup)
|
2025-03-24 18:13:06 +08:00
|
|
|
|
{
|
2025-03-25 17:58:48 +08:00
|
|
|
|
m_paginationInfo.entriesPerPage = 100;
|
|
|
|
|
|
m_paginationInfo.currentPage = 1;
|
|
|
|
|
|
m_paginationInfo.totalEntries = 0;
|
2025-03-24 18:13:06 +08:00
|
|
|
|
|
2025-03-27 21:01:25 +08:00
|
|
|
|
iniDisplayField();
|
2025-03-24 18:13:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AttributeTableModel::~AttributeTableModel()
|
|
|
|
|
|
{}
|
|
|
|
|
|
|
2025-03-27 14:47:51 +08:00
|
|
|
|
QModelIndex AttributeTableModel::index(int row, int column, const QModelIndex& parent) const
|
|
|
|
|
|
{
|
|
|
|
|
|
if(!hasIndex(row, column, parent))
|
|
|
|
|
|
return QModelIndex();
|
|
|
|
|
|
|
|
|
|
|
|
int dataCol = column - 1;
|
2025-03-27 21:01:25 +08:00
|
|
|
|
if(dataCol >= m_displayField.count())
|
2025-03-27 14:47:51 +08:00
|
|
|
|
return QModelIndex();
|
|
|
|
|
|
|
|
|
|
|
|
return createIndex(row, column);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-03-24 18:13:06 +08:00
|
|
|
|
QVariant AttributeTableModel::data(const QModelIndex& index, int role) const
|
|
|
|
|
|
{
|
|
|
|
|
|
if(!index.isValid())
|
|
|
|
|
|
return QVariant();
|
|
|
|
|
|
|
|
|
|
|
|
int row = index.row();
|
|
|
|
|
|
int col = index.column();
|
2025-03-25 17:58:48 +08:00
|
|
|
|
int globalRow = (m_paginationInfo.currentPage - 1) * m_paginationInfo.entriesPerPage + row;
|
2025-03-24 18:13:06 +08:00
|
|
|
|
|
|
|
|
|
|
if(index.column() == 0) //第一列显示行号
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (role)
|
|
|
|
|
|
{
|
|
|
|
|
|
case Qt::DisplayRole:
|
|
|
|
|
|
{
|
2025-03-27 14:47:51 +08:00
|
|
|
|
QString mark;
|
2025-03-24 18:13:06 +08:00
|
|
|
|
if(m_modifiedRows.contains(globalRow))
|
|
|
|
|
|
{
|
|
|
|
|
|
switch(m_modifiedRows[globalRow].state)
|
|
|
|
|
|
{
|
|
|
|
|
|
case Modified:
|
2025-03-27 14:47:51 +08:00
|
|
|
|
mark = "*";
|
2025-03-24 18:13:06 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case New:
|
2025-03-27 14:47:51 +08:00
|
|
|
|
mark = "+";
|
2025-03-24 18:13:06 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case Deleted:
|
2025-03-27 14:47:51 +08:00
|
|
|
|
mark = "-";
|
2025-03-24 18:13:06 +08:00
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-03-27 14:47:51 +08:00
|
|
|
|
return QString::number(globalRow + 1) + mark;
|
2025-03-24 18:13:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
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)
|
2025-03-26 15:57:08 +08:00
|
|
|
|
//return rowData.record.value(dataCol);
|
|
|
|
|
|
return rowData.values.value(dataCol);
|
2025-03-24 18:13:06 +08:00
|
|
|
|
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;
|
|
|
|
|
|
|
2025-03-27 21:01:25 +08:00
|
|
|
|
// QModelIndex numberIndex = createIndex(index.row(), 0);
|
|
|
|
|
|
// QString text = numberIndex.data(Qt::DisplayRole).toString();
|
|
|
|
|
|
// qDebug() << text;
|
|
|
|
|
|
// if(text.contains("-")) //删除状态不可编辑
|
|
|
|
|
|
// return false;
|
|
|
|
|
|
|
2025-03-24 18:13:06 +08:00
|
|
|
|
int row = index.row();
|
2025-03-25 17:58:48 +08:00
|
|
|
|
int globalRow = (m_paginationInfo.currentPage - 1) * m_paginationInfo.entriesPerPage + row;
|
2025-03-24 18:13:06 +08:00
|
|
|
|
int dataCol = index.column() - 1; //第一列显示了行号
|
|
|
|
|
|
//记录修改
|
|
|
|
|
|
RowData modifiedRow = m_currentPageData[row];
|
2025-03-26 15:57:08 +08:00
|
|
|
|
//modifiedRow.record.setValue(dataCol, value);
|
|
|
|
|
|
modifiedRow.values[dataCol] = value;
|
2025-03-24 18:13:06 +08:00
|
|
|
|
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
|
|
|
|
|
|
{
|
2025-03-28 17:40:59 +08:00
|
|
|
|
QString headerText = m_displayField.value(section - 1).displayName;
|
|
|
|
|
|
if(!m_displayField.value(section - 1).dataType.isEmpty())
|
|
|
|
|
|
headerText = headerText + "\n" + m_displayField.value(section - 1).dataType;
|
|
|
|
|
|
|
|
|
|
|
|
return headerText;
|
2025-03-24 18:13:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return QAbstractTableModel::headerData(section, orientation, role);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int AttributeTableModel::rowCount(const QModelIndex& parent) const
|
|
|
|
|
|
{
|
|
|
|
|
|
return m_currentPageData.count();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int AttributeTableModel::columnCount(const QModelIndex &) const
|
|
|
|
|
|
{
|
2025-03-27 21:01:25 +08:00
|
|
|
|
return m_displayField.isEmpty() ? 0 : m_displayField.count() + 1;
|
2025-03-24 18:13:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Qt::ItemFlags AttributeTableModel::flags(const QModelIndex &index) const
|
|
|
|
|
|
{
|
2025-03-27 21:01:25 +08:00
|
|
|
|
QModelIndex numberIndex = createIndex(index.row(), 0);
|
|
|
|
|
|
QString text = numberIndex.data(Qt::DisplayRole).toString();
|
|
|
|
|
|
|
2025-03-24 18:13:06 +08:00
|
|
|
|
Qt::ItemFlags flags = QAbstractTableModel::flags(index);
|
2025-03-28 17:40:59 +08:00
|
|
|
|
if (index.column() != 0 && !text.contains("-")) //行号列和处于删除状态的item不能编辑
|
2025-03-24 18:13:06 +08:00
|
|
|
|
flags = flags | Qt::ItemIsEditable;
|
|
|
|
|
|
return flags;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-03-27 21:01:25 +08:00
|
|
|
|
void AttributeTableModel::iniDisplayField()
|
|
|
|
|
|
{
|
|
|
|
|
|
FieldInfo field1;
|
|
|
|
|
|
field1.originalName = "attribute";
|
|
|
|
|
|
field1.displayName = QString::fromWCharArray(L"属性类别");
|
2025-03-28 17:40:59 +08:00
|
|
|
|
field1.dataType = "character varying(128)";
|
2025-03-27 21:01:25 +08:00
|
|
|
|
m_displayField.append(field1);
|
|
|
|
|
|
|
|
|
|
|
|
FieldInfo field2;
|
|
|
|
|
|
field2.originalName = "attribute_name";
|
|
|
|
|
|
field2.displayName = QString::fromWCharArray(L"属性名称");
|
2025-03-28 17:40:59 +08:00
|
|
|
|
field2.dataType = "character varying(64)";
|
2025-03-27 21:01:25 +08:00
|
|
|
|
m_displayField.append(field2);
|
|
|
|
|
|
|
|
|
|
|
|
FieldInfo field3;
|
|
|
|
|
|
field3.originalName = "data_type_id";
|
|
|
|
|
|
field3.displayName = QString::fromWCharArray(L"数据类型");
|
2025-03-28 17:40:59 +08:00
|
|
|
|
field3.dataType = "bigint";
|
2025-03-27 21:01:25 +08:00
|
|
|
|
m_displayField.append(field3);
|
|
|
|
|
|
|
|
|
|
|
|
FieldInfo field4;
|
|
|
|
|
|
field4.originalName = "length_precision";
|
|
|
|
|
|
field4.displayName = QString::fromWCharArray(L"数据精度");
|
2025-03-28 17:40:59 +08:00
|
|
|
|
field4.dataType = "integer";
|
2025-03-27 21:01:25 +08:00
|
|
|
|
m_displayField.append(field4);
|
|
|
|
|
|
|
|
|
|
|
|
FieldInfo field5;
|
|
|
|
|
|
field5.originalName = "default_value";
|
|
|
|
|
|
field5.displayName = QString::fromWCharArray(L"默认值");
|
2025-03-28 17:40:59 +08:00
|
|
|
|
field5.dataType = "character varying(64)";
|
2025-03-27 21:01:25 +08:00
|
|
|
|
m_displayField.append(field5);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-03-24 18:13:06 +08:00
|
|
|
|
void AttributeTableModel::loadPageData()
|
|
|
|
|
|
{
|
2025-03-26 15:57:08 +08:00
|
|
|
|
m_currentPageData.clear();
|
|
|
|
|
|
|
2025-03-24 18:13:06 +08:00
|
|
|
|
if (m_tableName.isEmpty())
|
|
|
|
|
|
{
|
|
|
|
|
|
LOG_ERROR("DB", QString("Attribute table name is empty, load data failed"));
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
beginResetModel();
|
|
|
|
|
|
|
2025-03-27 21:01:25 +08:00
|
|
|
|
QStringList columns;
|
|
|
|
|
|
for(int i = 0; i < m_displayField.count(); i++)
|
|
|
|
|
|
columns << m_displayField.at(i).originalName;
|
2025-03-24 18:13:06 +08:00
|
|
|
|
QString strSQL = QString("SELECT %1 FROM %2 LIMIT %3 OFFSET %4")
|
2025-03-27 21:01:25 +08:00
|
|
|
|
.arg(columns.join(", "))
|
2025-03-24 18:13:06 +08:00
|
|
|
|
.arg(m_tableName)
|
2025-03-25 17:58:48 +08:00
|
|
|
|
.arg(m_paginationInfo.entriesPerPage)
|
|
|
|
|
|
.arg((m_paginationInfo.currentPage - 1) * m_paginationInfo.entriesPerPage);
|
2025-03-24 18:13:06 +08:00
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
QSqlQuery query = SqlQueryExecutor::instance().executeSQL(m_connection, strSQL);
|
|
|
|
|
|
while(query.next())
|
|
|
|
|
|
{
|
|
|
|
|
|
RowData data;
|
2025-03-26 15:57:08 +08:00
|
|
|
|
//data.record = query.record();
|
2025-03-27 21:01:25 +08:00
|
|
|
|
for(int i = 0; i < m_displayField.count(); i++)
|
2025-03-26 15:57:08 +08:00
|
|
|
|
{
|
|
|
|
|
|
data.values.append(query.value(i));
|
|
|
|
|
|
}
|
2025-03-24 18:13:06 +08:00
|
|
|
|
m_currentPageData.append(data);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (const DatabaseException& e)
|
|
|
|
|
|
{
|
2025-03-25 17:58:48 +08:00
|
|
|
|
LOG_ERROR("SQL", QString::fromWCharArray(L"获取属性信息失败。modelID:%1, groupID:%2").arg(m_modelAttributeGroup.modelID, m_modelAttributeGroup.groupID));
|
2025-03-24 18:13:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
endResetModel();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-03-26 15:57:08 +08:00
|
|
|
|
void AttributeTableModel::setPageSize(int size)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(m_paginationInfo.entriesPerPage != size && size > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_paginationInfo.entriesPerPage = size;
|
|
|
|
|
|
refresh();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
int AttributeTableModel::pageSize() const
|
|
|
|
|
|
{
|
|
|
|
|
|
return m_paginationInfo.entriesPerPage;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void AttributeTableModel::setCurrentPage(int page)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(m_paginationInfo.currentPage != page && page > 0 && page <= totalPages())
|
|
|
|
|
|
{
|
|
|
|
|
|
m_paginationInfo.currentPage = page;
|
|
|
|
|
|
refresh();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
int AttributeTableModel::currentPage() const
|
|
|
|
|
|
{
|
|
|
|
|
|
return m_paginationInfo.currentPage;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int AttributeTableModel::totalPages() const
|
|
|
|
|
|
{
|
|
|
|
|
|
return qCeil(static_cast<qreal>(m_paginationInfo.totalEntries) / m_paginationInfo.entriesPerPage);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void AttributeTableModel::previousPage()
|
|
|
|
|
|
{
|
|
|
|
|
|
if(m_paginationInfo.entriesPerPage == 1)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
setCurrentPage(m_paginationInfo.entriesPerPage--);
|
|
|
|
|
|
}
|
|
|
|
|
|
void AttributeTableModel::nextPage()
|
|
|
|
|
|
{
|
|
|
|
|
|
if(m_paginationInfo.entriesPerPage == totalPages())
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
setCurrentPage(m_paginationInfo.entriesPerPage++);
|
|
|
|
|
|
}
|
|
|
|
|
|
void AttributeTableModel::firstPage()
|
|
|
|
|
|
{
|
|
|
|
|
|
if(m_paginationInfo.entriesPerPage == 1)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
setCurrentPage(1);
|
|
|
|
|
|
}
|
|
|
|
|
|
void AttributeTableModel::lastPage()
|
|
|
|
|
|
{
|
|
|
|
|
|
if(m_paginationInfo.entriesPerPage == totalPages())
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
setCurrentPage(totalPages());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-03-24 18:13:06 +08:00
|
|
|
|
void AttributeTableModel::updateTotalCount()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_tableName.isEmpty())
|
|
|
|
|
|
{
|
|
|
|
|
|
LOG_ERROR("SQL", QString::fromWCharArray(L"属性表名称为空,获取属性数量失败"));
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-03-25 17:58:48 +08:00
|
|
|
|
m_paginationInfo.totalEntries = SqlQueryExecutor::instance().getAttributeCount(m_connection, m_tableName);
|
2025-03-24 18:13:06 +08:00
|
|
|
|
}
|
2025-03-25 20:53:15 +08:00
|
|
|
|
|
2025-03-26 15:57:08 +08:00
|
|
|
|
void AttributeTableModel::setTable(const QString& tableName)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(m_tableName == tableName)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
m_tableName = tableName;
|
|
|
|
|
|
m_modifiedRows.clear();
|
|
|
|
|
|
refresh();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void AttributeTableModel::refresh()
|
|
|
|
|
|
{
|
|
|
|
|
|
if(!m_modifiedRows.isEmpty())
|
|
|
|
|
|
{
|
|
|
|
|
|
emit showMessage(type_question, QString::fromWCharArray(L"提示"),
|
|
|
|
|
|
QString::fromWCharArray(L"当前有编辑或修改数据未提交,是否进行提交?"));
|
|
|
|
|
|
if(g_msgDlgBtn == btn_Yes)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
m_modifiedRows.clear();
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
loadPageData();
|
|
|
|
|
|
updateTotalCount();
|
|
|
|
|
|
emit syncDataStatus(m_modifiedRows.isEmpty(), m_paginationInfo);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-03-27 14:47:51 +08:00
|
|
|
|
void AttributeTableModel::insertRecord(int row)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(row < 0 || row > rowCount())
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
RowData newRow;
|
|
|
|
|
|
newRow.state = New;
|
2025-03-27 21:01:25 +08:00
|
|
|
|
newRow.values.resize(m_displayField.count());
|
2025-03-27 14:47:51 +08:00
|
|
|
|
|
|
|
|
|
|
int globalRow = (m_paginationInfo.currentPage - 1) * m_paginationInfo.entriesPerPage + row;
|
|
|
|
|
|
m_modifiedRows[globalRow] = newRow;
|
|
|
|
|
|
|
|
|
|
|
|
beginInsertRows(QModelIndex(), row, row);
|
|
|
|
|
|
m_currentPageData.insert(row, newRow);
|
|
|
|
|
|
endInsertRows();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void AttributeTableModel::removeRecord(int row)
|
2025-03-26 15:57:08 +08:00
|
|
|
|
{
|
2025-03-27 14:47:51 +08:00
|
|
|
|
if(row < 0 || row > rowCount())
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
emit showMessage(type_question, QString::fromWCharArray(L"提示"),
|
|
|
|
|
|
QString::fromWCharArray(L"确认要删除该记录吗?"));
|
|
|
|
|
|
if(g_msgDlgBtn == btn_No)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int globalRow = (m_paginationInfo.currentPage - 1) * m_paginationInfo.entriesPerPage + row;
|
2025-03-27 21:01:25 +08:00
|
|
|
|
/*if(m_currentPageData.at(row).state == New) //新添加未提交的记录,直接删除
|
2025-03-27 14:47:51 +08:00
|
|
|
|
{
|
2025-03-27 21:01:25 +08:00
|
|
|
|
beginRemoveRows(QModelIndex(), row, row);
|
2025-03-27 14:47:51 +08:00
|
|
|
|
m_modifiedRows.remove(globalRow);
|
2025-03-27 21:01:25 +08:00
|
|
|
|
m_currentPageData.removeAt(row);
|
|
|
|
|
|
endRemoveRows();
|
2025-03-27 14:47:51 +08:00
|
|
|
|
}
|
2025-03-27 21:01:25 +08:00
|
|
|
|
else*/ //整行画红线进行标记
|
2025-03-27 14:47:51 +08:00
|
|
|
|
{
|
|
|
|
|
|
m_currentPageData[row].state = Deleted;
|
|
|
|
|
|
m_modifiedRows[globalRow] = m_currentPageData[row];
|
2025-03-27 21:01:25 +08:00
|
|
|
|
m_modifiedRows[globalRow].state = Deleted;
|
|
|
|
|
|
|
|
|
|
|
|
QModelIndex topLeft = createIndex(row, 0);
|
|
|
|
|
|
QModelIndex bottomRight = createIndex(row, columnCount() - 1);
|
|
|
|
|
|
emit dataChanged(topLeft, bottomRight, {Qt::DisplayRole});
|
2025-03-27 14:47:51 +08:00
|
|
|
|
}
|
2025-03-26 15:57:08 +08:00
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-03-25 20:53:15 +08:00
|
|
|
|
void AttributeTableModel::triggerSyncSignal()
|
|
|
|
|
|
{
|
|
|
|
|
|
emit syncDataStatus(m_modifiedRows.isEmpty(), m_paginationInfo);
|
|
|
|
|
|
}
|