如何正确使用Qt beginInsertRows

时间:2019-03-20 02:44:23

标签: c++ qt listview model-view-controller model

我有自己的自定义ItemModelItemDelegate

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();
}

Qt Documentation中,beginInsertRows具有三个参数:

  

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

     

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

我不确定如何在last中传递firstItemModel::Insert,无论插入数据的大小是0还是10或其他计数,我都会传递{{1 }}和first = 0,该视图将正常工作。当我插入10个项目并传递last = 0first = 0时,该视图也可以正常工作。这让我感到困惑。

last = 9

2 个答案:

答案 0 :(得分:2)

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

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

  beginInsertRows(QModelIndex(), items_.size(), items_.size() + 9);

答案 1 :(得分:0)

正如您突出显示的文档所述,重新实现虚拟功能QAbstractItemModel::insertRows

时,需要调用这两个功能

https://doc.qt.io/qt-5/qabstractitemmodel.html#insertRows

显然不是您在ItemModel :: Insert函数中正在执行的操作。