У меня есть подкласс QStandardItemModel, и я хочу связать его с TableView в QML. Но данные из QStandardItemModel не отображаются в TableView.
С ролью, установленной на «отображение» в табличном представлении, я могу видеть первый столбец, поэтому я повторно реализовал функцию roleNames () в своем классе, но все еще не увенчался успехом.
Я не уверен, как связать перечисление roleNames со столбцом в QStandardItemModel?
class AuditLogsModel : public QStandardItemModel
{
Q_OBJECT
QList<QStandardItem*> row;
public:
enum AuditRoles
{
DateTimeRole = Qt::UserRole + 1,
UsernameRole,
ApplicationRole,
CategoryRole,
DescriptionRole
};
...
Implementation (C++) source
AuditLogsModel::AuditLogsModel(QObject *parent)
: QStandardItemModel(parent)
{
row.clear();
loadData();
setColumnMapping();
}
void AuditLogsModel::setColumnMapping()
{
setData(index(0,0), "DateTime", AuditRoles::DateTimeRole);
setData(index(0,1), "Name", AuditRoles::UsernameRole);
setData(index(0,2), "Application", AuditRoles::ApplicationRole);
setData(index(0,3), "Category", AuditRoles::CategoryRole);
setData(index(0,4), "Description", AuditRoles::DescriptionRole);
}
QHash<int, QByteArray> AuditLogsModel::roleNames() const
{
QHash<int, QByteArray> roleNameMap;
roleNameMap[DateTimeRole] = "DateTime";
roleNameMap[UsernameRole] = "Name";
roleNameMap[ApplicationRole] = "Application";
roleNameMap[CategoryRole] = "Category";
roleNameMap[DescriptionRole] = "Description";
return roleNameMap;
}
void AuditLogsModel::loadData()
{
QFile file(AUDIT_LOG_PATH);
if( file.exists() == false )
{
syslog(LOG_ERR,qPrintable(QString("Audit log file: %1 does not exist").arg(AUDIT_LOG_PATH)));
return;
}
if (file.open(QIODevice::ReadOnly))
{
QTextStream in(&file);
QString line;
QJsonObject logEntry;
while(!in.atEnd()) {
line = in.readLine();
logEntry = (QJsonDocument::fromJson(line.toStdString().c_str())).object();
row.append(new QStandardItem(logEntry["Date-time"].toString()));
row.append(new QStandardItem(logEntry["username"].toString()));
row.append(new QStandardItem(logEntry["App_name"].toString()));
row.append(new QStandardItem(logEntry["event_category"].toString()));
row.append(new QStandardItem(logEntry["event_desc"].toString()));
appendRow(row);
row.clear();
}
file.close();
}
}
QML-код
TableView {
id: auditLogTable
[geometry]
model: auditLogModelObj
TableViewColumn {
role: "DateTime"
title: qsTr("Local Time")
width: auditLogTable.width * 0.15
}
TableViewColumn {
role: "Name"
title: qsTr("Created By")
width: auditLogTable.width * 0.1
}
TableViewColumn {
role: "Application"
title: qsTr("app name")
width: auditLogTable.width * 0.40
}
TableViewColumn {
role: "Category"
title: qsTr("Category")
width: auditLogTable.width * 0.2
}
TableViewColumn {
role: "Description"
title: qsTr("Detail")
width: auditLogTable.width * 0.40
}
}