Добрый день!
Создал свою модель на основе QAbstractTableModel. Данные для модели хранятся в QMap с ключом int и значением в своем типе на основе структуры. (Хотя изначально нужно было, чтобы QMap был с ключом типа QString).
#ifndef MYDATALISTMODEL_H
#define MYDATALISTMODEL_H
#include <QObject>
#include <QAbstractTableModel>
#include <QVariant>
#include <QModelIndex>
#include "structures.h"
class MyDataListModel : public QAbstractTableModel
{
public:
MyDataListModel(QWidget *parent = 0);
~MyDataListModel();
int rowCount(const QModelIndex &parent = QModelIndex()) const;
void updateModel(QString, tMyData, int indexRow = 0);
void clearData();
private:
QMap<int, tMyDataModel> MyDataList;
int columnCount(const QModelIndex &parent) const;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
QVariant data(const QModelIndex &index, int role) const;
};
#endif // MYDATALISTMODEL_H
#include "MyDatalistmodel.h"
MyDataListModel::MyDataListModel(QWidget *parent)
{
}
MyDataListModel::~MyDataListModel()
{
}
int MyDataListModel::rowCount(const QModelIndex &parent) const
{
return(MyDataList.keys().count());
}
void MyDataListModel::updateModel(QString MyDataName, tMyData MyDataInfo, int indexRow)
{
this->beginResetModel();
MyDataList[indexRow].MyDataName=MyDataName;
MyDataList[indexRow].MyDataInfo=MyDataInfo;
insertRow(indexRow);
this->endResetModel();
}
void MyDataListModel::clearData()
{
this->beginResetModel();
int rowC;
rowC=rowCount();
MyDataList.clear();
removeRows(0,rowC);
this->endResetModel();
}
int MyDataListModel::columnCount(const QModelIndex &parent) const
{
return(9);
}
QVariant MyDataListModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if(orientation == Qt::Horizontal && role == Qt::DisplayRole)
{
switch (section)
{
case 1:
{return(QVariant(tr("Icon")));}
break;
case 2:
{return(QVariant(tr("Data1")));}
break;
case 3:
{return(QVariant(tr("Data2")));}
break;
case 4:
{return(QVariant(tr("Data3")));}
break;
case 5:
{return(QVariant(tr("Data4")));}
break;
case 6:
{return(QVariant(tr("Data5")));}
break;
case 7:
{return(QVariant(tr("Data6")));}
break;
case 8:
{return(QVariant(tr("Data7")));}
break;
default:
{return(QVariant());}
break;
}
}
else
{return(QVariant());}
}
QVariant MyDataListModel::data(const QModelIndex &index, int role) const
{
if (role == Qt::DisplayRole)
{
QVariant Unswer;
switch (index.column())
{
case 0:
{Unswer=index.row();}
break;
case 2:
{Unswer=QVariant(MyDataList[index.row()].MyDataName);}
break;
case 3:
{Unswer=QVariant(MyDataList[index.row()].MyDataInfo.Data2);}
break;
case 4:
{
if (MyDataList[index.row()].MyDataInfo.Data3)
{Unswer=QVariant("3 A");}
else
{Unswer=QVariant("3 B");}
}
break;
case 5:
{Unswer=QVariant(MyDataList[index.row()].MyDataInfo.Data4);}
break;
case 6:
{
if (MyDataList[index.row()].MyDataInfo.Data5)
{Unswer=QVariant("5 A");}
else
{Unswer=QVariant("5 B");}
}
break;
case 7:
{Unswer=QVariant(MyDataList[index.row()].MyDataInfo.Data6);}
break;
case 8:
{Unswer=QVariant(MyDataList[index.row()].MyDataInfo.Data7);}
break;
default:
break;
}
return(Unswer);
}
else
{return(QVariant());}
}
Модель назначена для объекта класса QTableView.
MyDataModel = new MyDatatModel(this);
ui->tableView->setModel(APKListModel);
ui->tableView->setColumnHidden(0, true);
Проблем с отображением данных нет.
Однако, не работает сортировка.
До этого я с моделями не работал. Поэтому не знаю как правильно организовать.
Я не уверен, что QSortFilterProxyModel будет работать из-за такого выбора хранения данных для модели. Или это вообще роли не играет?