My model is a subclass of QAbstractTableModel
and I have overridden some methods to make this work.
class UserModel: public QAbstractTableModel
{
Q_OBJECT
public:
UserModel(QList<User> users, QObject *parent = Q_NULLPTR);
int rowCount(const QModelIndex &) const override
{
return users.size();
}
int columnCount(const QModelIndex &) const override
{
return 3;
}
QVariant data(const QModelIndex &index, int role) const override
{
if(role == Qt::DisplayRole)
{
User user = users.at(index.row());
QVariant data[] = { user.getFirstname(), user.getLastname() , user.getAge() };
return data[index.column()];
}
return {};
}
void sort(int column, Qt::SortOrder order) override
{
auto fnSort = [](const User & u1, const User & u2){ return u1.getFirstname() < u2.getFirstname(); };
auto lnSort = [](const User & u1, const User & u2){ return u1.getLastname() < u2.getLastname(); };
auto agSort = [](const User & u1, const User & u2){ return u1.getAge() < u2.getAge(); };
std::function<bool (const User &, const User &)> sortFn[] = {fnSort, lnSort, agSort};
std::sort(users.begin(), users.end(), sortFn[column]);
if(order == Qt::DescendingOrder)
{
std::reverse(users.begin(), users.end());
}
}
bool insertRows(int position, int rows, const QModelIndex &index) override
{
Q_UNUSED(index);
beginInsertRows(QModelIndex(), position, position + rows - 1);
for (int row = 0; row < rows; ++row)
users.insert(position, {User()});
endInsertRows();
return true;
}
bool setData(const QModelIndex &index, const QVariant &value, int role) override
{
if (index.isValid() && role == Qt::EditRole) {
int row = index.row();
User u = users.value(row);
if (index.column() == 0)
u.setFirstname(value.toString());
else if (index.column() == 1)
u.setLastname(value.toString());
else
return false;
users.replace(row, u);
emit(dataChanged(index, index));
return true;
}
return false;
}
Qt::ItemFlags flags(const QModelIndex &index) const override
{
return Qt::ItemIsEditable | QAbstractTableModel::flags(index);
}
QVariant headerData(int section, Qt::Orientation orientation, int role) const override
{
if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
switch (section) {
case 0:
return QString("firstname");
case 1:
return QString("lastname");
case 2:
return QString("age");
}
}
return QVariant();
}
signals:
void editCompleted(const QString &);
private:
QList<User> users;
};
#endif // USERMODEL_H
with that, i see my table:
this->model = new UserModel(users, this);
this->m_proxy->setSourceModel(this->model);
this->ui->tableView->setModel(this->m_proxy);
I try to make my model work with something like:
this->model->addSomethingToMyModel(newUser);
Seems to be LOOOOOOT more complicated. Can you help me a bit ? I have based my code on the AdressBook exemple