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)
0, 0不正确,因为“第一个和最后一个是新行插入后将具有的行号。” 使用这些参数,视图可能看起来仍然正确,但可能存在您尚未看到的问题。
0, 9Insert()是正确的,但只调用第一次,因为您要将新数字添加到末尾。您需要添加items_.size()这两个参数。IE:
beginInsertRows(QModelIndex(), items_.size(), items_.size() + 9);
Run Code Online (Sandbox Code Playgroud)