qml使用QAbstractListModel作为数据源

6 篇文章 1 订阅

在日常开发中界面为了快速并且炫酷,大家可能会选择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<int, QByteArray> 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的使用哦!以免造成内存泄漏!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值