Не могу понять как происходит взаимодействие модели и представления.
Нужно добавить элемент в модель и установить для него виджет в отображении. У 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
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
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;
}
Комментариев нет:
Отправить комментарий