Страницы

Поиск по вопросам

среда, 17 июля 2019 г.

Добавление элемента в модель

Не могу понять как происходит взаимодействие модели и представления. Нужно добавить элемент в модель и установить для него виджет в отображении. У QListView есть метод setIndexWidget, который принимает индекс, но как правильно создать этот индекс? То есть, у QModelIndex конструктор создает не валидный индекс, если я сначала добавлю строку, а потом возьму ее индекс, то он все равно будет не валиден:
int row = model->rowCount(); model->insertRow(row);
QModelIndex index = model->index(row); // isValid() == false
Объясните пожалуйста как это работает
Если сильно упростить код модели, то получится что-то такое:
class ContactList : public QAbstractListModel { Q_OBJECT
public: explicit ContactList(QObject *parent = 0); ~ContactList() {}
int rowCount(const QModelIndex& parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int) const override;
QModelIndex index(int row, int column, const QModelIndex& parent) const override;
private: QVector models_; };

int ContactList::rowCount(const QModelIndex&) const { return models_.size(); }
QVariant ContactList::data(const QModelIndex &index, int) const { if(!index.isValid()) return QVariant();
return QVariant::fromValue(models_.at(index.row())); }
QModelIndex ContactList::index(int row, int column, const QModelIndex &parent) const { if(hasIndex(row, column, parent)) return createIndex(row, column, reinterpret_cast(models_[row]));
return QModelIndex(); }


Ответ

Проблема состояла в том, что метод insertRow вызывает внутри себя метод insertRows, который было необходимо переопределить. После того как я это сделал, все заработало.
bool ContactList::insertRows(int row, int count, const QModelIndex &parent) { int end = row + count - 1;
beginInsertRows(parent, row, end); for(int i = row; i < end; ++i) models_.append(Q_NULLPTR); endInsertRows();
return true; }

Комментариев нет:

Отправить комментарий