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

198
19 ноября 2017, 16:39

Не могу понять как происходит взаимодействие модели и представления.
Нужно добавить элемент в модель и установить для него виджет в отображении. У 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<MyAbstractModel*> 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<void*>(models_[row]));
    return QModelIndex();
}
Answer 1

Проблема состояла в том, что метод 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;
}
READ ALSO
Неправильная конвертация lat/long в UTM

Неправильная конвертация lat/long в UTM

Имею вот такие координаты в latitude и longitude

243
Битмап из ресурсов и кисть

Битмап из ресурсов и кисть

Хочу закрасить окно узором битмапа, который грузится из ресурсов и помещается в кистьНе могу понять какие лучше функции использовать и с чего...

219
Оптимизация tmp переменной в функции

Оптимизация tmp переменной в функции

Подскажите, пожалуйста, какую оптимизацию проведет компилятор в таком коде:

247
2 оператора присваивания или один?

2 оператора присваивания или один?

Итак имеется два оператора присваивания - копирующий и перемещающий, например такие:

200