Не могу понять как происходит взаимодействие модели и представления.
Нужно добавить элемент в модель и установить для него виджет в отображении. У 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();
}
Проблема состояла в том, что метод 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;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Хочу закрасить окно узором битмапа, который грузится из ресурсов и помещается в кистьНе могу понять какие лучше функции использовать и с чего...
Подскажите, пожалуйста, какую оптимизацию проведет компилятор в таком коде:
Итак имеется два оператора присваивания - копирующий и перемещающий, например такие: