qml使用QAbstractListModel作为数据源

在日常开发中界面为了快速并且炫酷,大家可能会选择qml作为主体。但是后台数据的提供还是用qt c++的实现,MVC中即可用Model进行。例如:QAbstractListModel

一般的使用只实现下面三个函数即可支撑qml中的交互:

QVariant QAbstractItemModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
int QAbstractItemModel::rowCount(const QModelIndex &parent = QModelIndex()) const
QHash QAbstractItemModel::roleNames() const

但是想要一些其他的功能,就需要自己去实现了!


一、例如想进行元素的移动,就需要model进行支撑

void AppInfoModel::move(int from, int to, int n)
{
    Q_UNUSED(n)
    int offset = 0;
    if(from == to) {
        return;
    } else if(to > from) {
        offset = to - from;
    }

    const QModelIndex& parent = QModelIndex();
    beginMoveRows(parent, from, from, parent, to + offset);
    AppInfo* item = appInfos_.takeAt(from);
    appInfos_.insert(to,item);
    endMoveRows();
}

主要在于beginMoveRows&endMoveRows中间进行的操作,将待移动项取出并插入到新位置。

需要注意上移和下移是不一样的呦!

二、又例如想进行元素的删除,也需要model进行支撑

void AppInfoModel::remove(int index)
{
    beginRemoveRows(QModelIndex(), index, index);
    QObject *obj = appInfos_.at(index);
    appInfos_.removeAt(index);
    obj->deleteLater();
    endRemoveRows();
}

主要在于beginRemoveRows&endRemoveRows中间进行的操作,将待删除元素取出,在model实际数据存储处进行remove,最后再将元素彻底delete。

需要注意deleteLater的使用哦!以免造成内存泄漏!

你可能感兴趣的:(QML,Qt,qt)