Cześć, robię swój model dziedzicząc po QStandardItemModel
. Próbuję zrozumieć jak się tworzy własny model i napotkałem problem, że nie chce mi działać funkcja Qt::ItemFlags DataModel::flags
i funkcja QVariant DataModel::data
- dlaczego ? Co zrobiłem źle ?
wygląd modelu -> plik DataModel.h
class DataModel : public QStandardItemModel
{
Q_OBJECT
public:
DataModel(QObject *parent=nullptr);
private:
// QAbstractItemModel interface
virtual int rowCount(const QModelIndex &parent) const override;
virtual int columnCount(const QModelIndex &parent) const override;
virtual QVariant data(const QModelIndex &index, int role) const override;
virtual bool setData(const QModelIndex &index, const QVariant &value, int role) override;
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
virtual bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role) override;
virtual Qt::ItemFlags flags(const QModelIndex &index) const override;
};
plik DataModel.cpp
#include "datamodel.h"
#include <QDebug>
DataModel::DataModel(QObject *parent) : QStandardItemModel(parent)
{
}
int DataModel::rowCount(const QModelIndex &parent) const
{
return 3;
}
int DataModel::columnCount(const QModelIndex &parent) const
{
return 4;
}
QVariant DataModel::data(const QModelIndex &index, int role) const //ta funkcja nie wyświetla danych w widoku
{
if(role==Qt::DisplayRole){
if(index.row()==0 && index.column()==0){
QVariant data;
data="pierwszy wpis";
return data;
}
}
return QVariant();
}
bool DataModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
return true;
}
QVariant DataModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if(role==Qt::DisplayRole && orientation==Qt::Horizontal){
return QString("Nagłówek %1").arg(section+1);
}
if(role==Qt::DisplayRole && orientation==Qt::Vertical){
return QString("%1").arg(section+1);
}
return QVariant();
}
bool DataModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role)
{
if(role==Qt::DisplayRole && orientation==Qt::Horizontal){
if(section==0){
emit setHeaderData(section, orientation, value, role);
return true;
}
}
return true;
}
Qt::ItemFlags DataModel::flags(const QModelIndex &index) const //ta funkcja nie daje pola do edycji
{
Qt::ItemFlags flag = QStandardItemModel::flags(index);
if(index.column()==0){
flag |= Qt::ItemIsEditable;
return flag;
}
return flag;
}
plik mainwindow.cpp
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow{parent}
{
this->resize(500,400);
mainWidget = new QWidget(this);
mainVlayout = new QVBoxLayout(mainWidget);
bttHlayout = new QHBoxLayout();
myModel = new DataModel(this); //tutaj jest mój model
tableView = new QTableView(this);
tableView->setModel(myModel);
bttAddRecord = new QPushButton(this);
bttAddRecord->setText(QString(tr("Dodaj rekord")));
bttClose = new QPushButton(this);
bttClose->setText(QString(tr("Zamknij")));
mainVlayout->addWidget(tableView);
mainVlayout->addLayout(bttHlayout);
bttHlayout->addWidget(bttAddRecord);
bttHlayout->addWidget(bttClose);
this->setCentralWidget(mainWidget);
QObject::connect(bttClose, &QPushButton::clicked, this, &MainWindow::close);
}