簡體   English   中英

如何正確使用 Qt beginInsertRows

[英]How to use Qt beginInsertRows correctly

我有我的自定義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() 時,必須在將數據插入模型的底層數據存儲之前調用此函數。
父索引對應於插入新行的父索引; first 和 last 是新行插入后的行號。

我不確定如何在我的ItemModel::Insert傳遞lastfirst ,無論插入的數據的大小是 0 或 10 還是其他計數,我傳遞first = 0last = 0 ,視圖都能正常工作。 當我插入 10 個項目,並通過first = 0last = 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();
}

0, 0不正確,因為“第一個最后一個是新行插入的行號。” 使用這些參數,視圖可能看起來仍然正確,但其中可能存在您尚未看到的問題。

0, 9是正確的,但僅在第一次調用Insert() ,因為您將新數字添加到末尾。 您需要將items_.size()添加到這兩個參數。 IE:

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

正如您突出顯示的文檔所說,您需要在重新實現虛函數QAbstractItemModel::insertRows時調用這兩個函數

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

這顯然不是您在 ItemModel::Insert 函數中所做的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM