Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use Qt beginInsertRows correctly

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();
}
like image 648
chen junhan Avatar asked Sep 18 '25 08:09

chen junhan


1 Answers

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);
like image 139
RyanCu Avatar answered Sep 20 '25 01:09

RyanCu