如何正确使用Qt beginInsertRows

che*_*han 4 c++ model-view-controller qt listview model

我有我的ItemModel习惯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();
}
Run Code Online (Sandbox Code Playgroud)

Qt Documentation来看,它beginInsertRows有三个参数:

void QAbstractItemModel::beginInsertRows(const QModelIndex &parent, int first, int last)

开始行插入操作。
在子类中重新实现 insertRows() 时,必须在将数据插入模型的基础数据存储之前调用此函数。
父索引对应于插入新行的父索引;第一个和最后一个是新行插入后将具有的行号。

我不知道如何传递lastand first,在我的 中ItemModel::Insert,无论插入数据的大小是 0 或 10 或其他计数,我传递first = 0and last = 0,视图都可以正常工作。当我插入 10 个项目并传递first = 0和时last = 9,视图也可以正常工作。这让我很困惑。

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();
}
Run Code Online (Sandbox Code Playgroud)

Rya*_*nCu 7

0, 0不正确,因为“第一个最后一个是新行插入后将具有的行号。” 使用这些参数,视图可能看起来仍然正确,但可能存在您尚未看到的问题。

0, 9Insert()是正确的,但只调用第一次,因为您要将新数字添加到末尾。您需要添加items_.size()这两个参数。IE:

  beginInsertRows(QModelIndex(), items_.size(), items_.size() + 9);
Run Code Online (Sandbox Code Playgroud)