Qt Quick之ListView下拉刷新数据

本文介绍了如何在Qt Quick的ListView中实现下拉刷新功能。通过监听flickStarted和flickEnded信号,结合C++ Model动态加载数据,并在QML中处理相关事件。详细讲述了C++模型的实现,C++模型导出到QML以及QML代码中的事件处理器。最后展示了下拉刷新的效果。

    Qt Quick里的ListView,本身是Flickable的派生类,当你用鼠标拖曳或者手指触摸(触摸屏)时,会产生flickStarted和flickEnded两个信号,利用这两个信号,就可以实现下拉刷新数据,当然上拉刷新也是可以的。

    创建一个Qt Quick App项目,添加dynamicModel.h和dynamicModel.cpp两个文件,用于实现DynamicListModel。项目创建过程参考《Qt Quick 之 Hello World 图文详解》。

    我们实现的下拉刷新效果有点儿特别,每次刷新后,只保留预定义的一页数据,比如代码中默认的页大小为20。

    版权所有foruok,转载请注明出处:http://blog.csdn.net/foruok

C++ model实现

    很简单,直接上代码了。

    dynamic.h:

#ifndef DYNAMICMODEL_H
#define DYNAMICMODEL_H
#include <QAbstractListModel>

class DynamicListModelPrivate;
class DynamicListModel : public QAbstractListModel
{
    Q_OBJECT
    Q_PROPERTY(int pageSize READ pageSize WRITE setPageSize NOTIFY pageSizeChanged)
    Q_PROPERTY(int total READ total WRITE setTotal NOTIFY totalChanged)
public:
    DynamicListModel(QObject *parent = 0);
    ~DynamicListModel();

    int rowCount(const QModelIndex &parent) const;
    QVariant data(const QModelIndex &index, int role) const;
    QHash<int, QByteArray> roleNames() const;

    Q_INVOKABLE void loadMore(bool forward);

    int pageSize();
    void setPageSize(int size);
    int total();
    void setTotal(int total);

signals:
    void pageSizeChanged(int size);
    void totalChanged(int total);

private:
    DynamicListModelPrivate *m_dptr;
};

#endif // DYNAMICMODEL_H

    dynamicModel.cpp:

#include "dynamicModel.h"
#include <QDebug>

class DynamicListModelPrivate
{
public:
    DynamicListModelPrivate(DynamicListModel *model)
        : m_model(model), m_start(0), m_end(20)
        , m_total(100), m_pageSize(20)
    {
        m_roleNames.insert(Qt::UserRole, "content");
    }

    void pageDown()
    {
        if(m_end < m_total)
        {
            m_start += m_pageSize;
            m_end += m_pageSize;
            if(m_end > m_total)
            {
                m_end = m_total;
                m_start = m_end - m_pageSize;
            }
        }
    }

    void pageUp()
    {
        if(
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

foruok

你可以选择打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值