@SGaist here is my code
I created a QAbstractListModel based on tableView
//your code here
#ifndef CANMESSAGEMODEL_H
#define CANMESSAGEMODEL_H
#include "cancontroller.h"
#include "canmessage.h"
class CanMessageModel : public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY(CanController* dataSource READ dataSource WRITE setDataSource )
enum CanMessageDetails{
idRole=Qt::UserRole,
dataRole=Qt::UserRole+1,
sizeRole=Qt::UserRole+2,
timeRole=Qt::UserRole+3,
periodRole=Qt::UserRole+4,
nodeIDRole=Qt::UserRole+5,
fctTypeRole=Qt::UserRole+6
};
public:
explicit CanMessageModel(QObject *parent=nullptr);
int rowCount(const QModelIndex &index=QModelIndex()) const;
QVariant data(const QModelIndex &index,int role=Qt::DisplayRole) const;
Qt::ItemFlags flags(const QModelIndex &index) const;
bool setData(const QModelIndex &index, const QVariant &value,int role);
Q_INVOKABLE void setDataSource(CanController * dataSource);
QHash<int,QByteArray> roleNames() const;
CanController *dataSource() const;
signals:
private:
// QList<CanMessage*> m_canMessages;
CanController *m_dataSource;
bool m_signalConnected;
};
//Q_DECLARE_METATYPE(CanMessageModel)
#endif // CANMESSAGEMODEL_H
//model.cpp
#include <QDebug>
#include "canmessagemodel.h"
CanMessageModel::CanMessageModel(QObject *parent):QAbstractListModel (parent),m_signalConnected(false)
{
setDataSource(new CanController(this));
}
int CanMessageModel::rowCount(const QModelIndex &index) const
{
Q_UNUSED(index)
return m_dataSource->dataItems().size();
}
QVariant CanMessageModel::data(const QModelIndex &index, int role) const
{
Q_UNUSED(role)
if (index.row() < 0 || index.row() >= m_dataSource->dataItems().size())
return QVariant();
CanMessage *message= m_dataSource->dataItems().values().at(index.row());
if(role == idRole)
return message->getID();
else if(role == dataRole)
return message->getData();
else if(role == sizeRole)
return message->getLength();
else if(role == timeRole)
return message->getTimeStamp();
else if(role == periodRole)
return message->getPeriod();
else if(role ==nodeIDRole)
return message->nodeId();
else if(role ==fctTypeRole)
return message->fct_Type();
return QVariant();
}
Qt::ItemFlags CanMessageModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return Qt::NoItemFlags;
return Qt::ItemIsEditable;
}
QHash<int, QByteArray> CanMessageModel::roleNames() const
{
QHash<int, QByteArray> roles;
roles[idRole] = "identifier";
roles[dataRole] = "payload";
roles[sizeRole] = "size";
roles[timeRole] = "timeStamp";
roles[periodRole]="period";
roles[nodeIDRole]="nodeID";
roles[fctTypeRole]="functionType";
return roles;
}
bool CanMessageModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
CanMessage *message= m_dataSource->dataItems().values().at(index.row());
bool somethingChanged=false;
switch (role) {
case idRole:{
if(message->getID()!=value.toString()){
message->setID(value.toString());
somethingChanged=true;
}
}
break;
case dataRole:{
if(message->getData()!=value.toString()){
message->setData(value.toString());
somethingChanged=true;
}
}
break;
case sizeRole:{
if(message->getLength()!=value.toString()){
message->setLength(value.toString());
somethingChanged=true;
}
}
break;
case timeRole:{
if(message->getTimeStamp()!=value.toString()){
message->setTimeStamp(value.toString());
somethingChanged=true;
}
}
break;
case periodRole:{
if(message->getPeriod()!=value.toString()){
message->setPeriod(value.toString());
somethingChanged=true;
}
}
break;
case nodeIDRole:{
if(message->nodeId()!=value.toString()){
message->setnodeId(value.toString());
somethingChanged=true;
}
}
break;
case fctTypeRole:{
if(message->fct_Type()!=value.toString()){
message->setFct_Type(value.toString());
somethingChanged=true;
}
}
}
if(somethingChanged){
emit dataChanged(index,index,QVector<int>()<<role);
return true;
}
return false;
}
CanController *CanMessageModel::dataSource() const
{
return m_dataSource;
}
void CanMessageModel::setDataSource(CanController *dataSource)
{
beginResetModel();
if(m_dataSource && m_signalConnected)
m_dataSource->disconnect(this);
m_dataSource=dataSource;
connect(m_dataSource,&CanController::preMessageAdded,this,[=](){
const int index=m_dataSource->dataItems().size();
beginInsertRows(QModelIndex(),index,index);
});
connect(m_dataSource,&CanController::postMessageAdded,this,[=](){
endInsertRows();
});
connect(m_dataSource,&CanController::preMessageSent,this,[=](){
const int index=m_dataSource->dataItems().size();
beginInsertRows(QModelIndex(),index,index);
});
connect(m_dataSource,&CanController::postMessageSent,this,[=](){
endInsertRows();
});
m_signalConnected=true;
endResetModel();
}
And it qml i create my Tableview with following delegate
//your code here
import QtQuick 2.12
import QtQuick.Controls 2.12
Column{
TableView{
implicitHeight: 200
id : mListView
width: parent.width
height: parent.height
model : myModel
delegate: Item {
height: parent.height
width: parent.width
Row{
//spacing: 0
anchors.fill: parent
//anchors.margins:0
TextField{
focus: true
text: model.identifier;
//wrapMode: Text.WordWrap
//canUndo: true
}
TextField{
focus: true
id : m_payload
text: model.payload
// canUndo: true
}
TextField{
focus: true
id:m_length
text: model.size
}
TextField{
focus: true
text: model.timeStamp
}
TextField{
focus:true
text: model.period
}
TextField{
focus:true
text: model.nodeID
}
TextField{
focus:true
text: model.functionType
}
}
}
}
}