I have my custom ItemModel
and ItemDelegate
:
class ItemModel : public QAbstractListModel {
Q_OBJECT
public:
// return items_.size();
int rowCount(const QModelIndex &parent = QModelIndex()) const;
// return items_[index.row()];
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
void Insert(const QVector<QString> &data);
private:
QVector<QString> items_;
};
void ItemModel::Insert(const QVector<QString> &data) {
// my question is the 'first' and 'last' args of beginInsertRows
beginInsertRows(QModelIndex(), 0, 0);
items_.insert(items_.begin(), data.begin(), begin.end());
endInsertRows();
}
From Qt Documentation, it say beginInsertRows
has three args:
void QAbstractItemModel::beginInsertRows(const QModelIndex &parent, int first, int last)
Begins a row insertion operation.
When reimplementing insertRows() in a subclass, you must call this function before inserting data into the model's underlying data store.
The parent index corresponds to the parent into which the new rows are inserted; first and last are the row numbers that the new rows will have after they have been inserted.
I am not sure how to pass last
and first
, in my ItemModel::Insert
, whatever the size of the inserted data is 0 or 10 or other count, I pass first = 0
and last = 0
, the view work correctly. When I insert 10 items, and pass first = 0
and last = 9
, the view work correctly too. It confuse me.
void ItemModel::Insert() {
beginInsertRows(QModelIndex(), 0, 0);
for(int i = 0; i < 10; ++i) {
items_.push_back(QString::number(i);
}
endInsertRows();
}
// or
void ItemModel::Insert() {
beginInsertRows(QModelIndex(), 0, 9);
for(int i = 0; i < 10; ++i) {
items_.push_back(QString::number(i));
}
endInsertRows();
}
0, 0
is not correct because "first and last are the row numbers that the new rows will have after they have been inserted." The view may still look correct using these parameters but there might be problems from it you haven't seen yet.
0, 9
is correct, but only the first time Insert()
is called, because you are adding the new numbers to the end. You need to add items_.size()
to both parameters. I.e.:
beginInsertRows(QModelIndex(), items_.size(), items_.size() + 9);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With