Пишу модель, унаследованную от абстрактной
QAbatractTableModel
. Всё по феншую, методы, все, что надо переписал. Но решил я кэшировать данные в свойстве
cache
. Следовательно надо менять метод
data
и
setData
. В итоге получилось:
QVariant MyModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid()) return QVariant();
if (!cache.contains(m_course)) {
QMap<QDate, Week> weeks;
Week week;
QVector<ScheduleItemPrintable> day;
for (int nDay = 0; nDay < 7; ++nDay) {
for (int nDoublePeriod = 0; nDoublePeriod < 6; ++nDoublePeriod)
day << ScheduleItemPrintable();
week << day;
}
weeks.insert(m_monday, week);
cache.insert(m_course, weeks); // ошибка
}
//...
}
Интерфейс класса модели:
class MyModel : public QAbstractTableModel
{
Q_OBJECT
private:
QStringList hheader;
typedef QVector<QVector<ScheduleItemPrintable> > Week;
QMap<QString, QMap<QDate, Week> > cache;
QString m_course;
QDate m_monday;
public:
explicit MyModel(QObject *parent = 0);
int rowCount(const QModelIndex &parent) const;
int columnCount(const QModelIndex &parent) const;
Qt::ItemFlags flags(const QModelIndex &index) const;
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role);
QVariant data(const QModelIndex &index, int role) const;
bool setData(const QModelIndex &index, const QVariant &value, int role);
};
В помеченном месте в первом листинге возникает ошибка:
error: passing
'const QMap<QString, QMap<QDate, QVector<QVector<ScheduleItemPrintable> > > >'
as 'this' argument of 'QMap<Key, T>::iterator QMap<Key, T>::insert(const Key&, const T&)
[with Key = QString; T = QMap<QDate, QVector<QVector<ScheduleItemPrintable> > >]'
discards qualifiers [-fpermissive] cache.insert(m_course, weeks);
Вот и не пойму. Вроде бы всё законно. Свойство лежит в объекте и доступ из методов есть. Что не так?
P. S.: проблема решена с указателем на кэш, но всё же интересно, почему простым объектом не обойтись?