我有自己的自定义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();
}
在Qt Documentation中,beginInsertRows
具有三个参数:
void QAbstractItemModel :: beginInsertRows(const QModelIndex&parent,int first,int last)
开始行插入操作。
在子类中重新实现insertRows()时,必须先调用此函数,然后再将数据插入模型的基础数据存储中。
父索引对应于插入新行的父索引;第一个和最后一个是新行插入后的行号。
我不确定如何在last
中传递first
和ItemModel::Insert
,无论插入数据的大小是0还是10或其他计数,我都会传递{{1 }}和first = 0
,该视图将正常工作。当我插入10个项目并传递last = 0
和first = 0
时,该视图也可以正常工作。这让我感到困惑。
last = 9
答案 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函数中正在执行的操作。