Есть некоторые данные в таком виде
QList <Task> tasks;
Модель для этих данных
// taskmodel.h
#ifndef TASKSMODEL_H
#define TASKSMODEL_H
#include <QAbstractListModel>
#include "def.h"
// реализация модели задач
class TasksModel : public QAbstractListModel
{
Q_OBJECT
QList <Task> tasks;
public:
explicit TasksModel(QObject *parent = 0);
int rowCount(const QModelIndex &parent = QModelIndex()) const;
QVariant data(const QModelIndex &index, int role) const;
void resetData(const QList<Task> &taskslist);
Task getItem(const QModelIndex &index);
signals:
public slots:
};
#endif // TASKSMODEL_H
// taskmodel.cpp
#include "tasksmodel.h"
TasksModel::TasksModel(QObject *parent) :
QAbstractListModel(parent)
{
}
int TasksModel::rowCount(const QModelIndex &parent) const
{
return this->tasks.count();
}
QVariant TasksModel::data(const QModelIndex &index, int role) const
{
// проверяем на валидность и на выход из диапазона
if(!index.isValid() or index.row() >= this->tasks.count())
return QVariant();
// возвращаем то, что нужно
switch(role){
case Qt::DisplayRole:
return this->tasks.at(index.row()).title;
break;
case Qt::ToolTipRole:
return this->tasks.at(index.row()).details;
break;
default:
return QVariant();
break;
}
}
void TasksModel::resetData(const QList<Task> &taskslist)
{
this->beginResetModel();
this->tasks.clear();
this->tasks = taskslist;
this->endResetModel();
}
Task TasksModel::getItem(const QModelIndex &index)
{
return this->tasks.at(index.row());
}
и к ней прокси модель для отображения на QListView с фильтром по дате
// taskproxymodel.h
#ifndef TASKSPROXYMODEL_H
#define TASKSPROXYMODEL_H
#include <QSortFilterProxyModel>
#include <QDate>
#include "tasksmodel.h"
#include "def.h"
#include <QDebug>
class TasksProxyModel : public QSortFilterProxyModel
{
QDate filter;
public:
TasksProxyModel();
void setFilter(const QDate &filter);
const QDate getFilter() const;
protected:
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;
};
#endif // TASKSPROXYMODEL_H
// taskproxymodel.cpp
#include "tasksproxymodel.h"
TasksProxyModel::TasksProxyModel()
{
}
void TasksProxyModel::setFilter(const QDate &filter)
{
this->filter = filter;
this->filterChanged();
}
const QDate TasksProxyModel::getFilter() const
{
return this->filter;
}
bool TasksProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
TasksModel *model = (TasksModel *)this->sourceModel();
Task rec = model->getItem(model->index(source_row, 0, source_parent));
// если подходит под фильтр, то true
return rec.date == this->filter ? true : false;
}
Собственно вопрос: как же правильно удалить одну запись из списка, из модели и из проксимодели? пробовал вот так
// получаем индекс элемента в исходной модели
QModelIndex index = this->tasksProxyModel.mapToSource(this->ui->lv_tasks->currentIndex());
// удаляем элемент из прокси модели
this->tasksProxyModel.removeRow(this->ui->lv_tasks->currentIndex().row());
// удаляем элемент из исходной модели
this->tasksModel.removeRow(index.row());
// удаляем элемент из списка по полученному индексу
this->tasks.removeAt(index.row());
// получаем индекс элемента в исходной модели
QModelIndex index = this->tasksProxyModel.mapToSource(this->ui->lv_tasks->currentIndex());
// удаляем элемент из списка по полученному индексу
this->tasks.removeAt(index.row());
this->tasksModel.resetData(this->tasks);