QListWidget下拉刷新,上拉加载

1,上拉加载更多实现
1.1,网上大部分都是如下实现方式:
//scrollChanged(int )这个是自己定义的槽函数
connect(verticalScrollBar(),SIGNAL(valueChanged(int )),this,SLOT(scrollChanged(int )));

void ListWidget::scrollChanged(int value)
{
      firstVisiableItem_ = value;
//     scrollbar的最大值和当前位置value比较,并且当前的count() > 0(防止为空时触发加载更多),这里的loadingMore是判断当前是否正在加载更多中
      if(scrollBar_->maximum()==value && !loadingMore_ && count() > 0){
          startLoadMore();
      }
}

主要是通过valueChanged(int )监听当前的Scrollbar位置变化确认是否到达列表底部,进而是否触发加载更多。但是这个是有问题的,如果当前只有一两条数据填充(qlistWidget未被填满,value不会变化)是不会触发这个方法的,也就无法继续加载更多了。

1.2,通过QScrollBar::actionTriggered可以解决上面问题(上面的补充,不是替换)

1.1中无法覆盖的业务场景是:列表未被填满,向上滑动鼠标时,无法触发上拉加载更多。
解决思路是:
当滑动鼠标时可以触发QScrollBar::actionTriggered(QAbstractSlider::SliderMove)方法执行,重写wheelEvent(QWheelEvent*event)判断向上还是向下滑动。
所以代码添加如下:

void ListWidget::wheelEvent(QWheelEvent*event){
    QListWidget::wheelEvent(event);
    if(event->delta() > 0){	//鼠标往靠近身体侧相反方向滚动
        wheelUp_ = true;
    }else{
        wheelUp_ = false;	//鼠标往靠近身体侧滚动
    }


}
void ListWidget::actionTriggered(int action)
{
    if(refreshing_){
        return;
    }
    //仅仅当第一条可见时(当列表未被填满或者向下滚动到第一条可见时满足firstVisiableItem_ == 0)
    if(firstVisiableItem_ == 0){
        if(action == QAbstractSlider::SliderMove){
            if(++refreshingThreshHold_ >= REFRESHTHRESHHOLD){ //触发阈值(这里是四次),防止误触发


                if(wheelUp_){		 						  //下拉还是上拉判断标志位
                    startRefrshing();						  //开始下拉刷新
                }else{
                    startLoadMore(); 						  //开始上拉加载
                }
                return;
            }
        }
    }else{
       resetRefreshingHold(); 								  //重置refreshingThreshHold_值
    }
}
1.3,加载更多的回调
void ListWidget::startLoadMore()
{
    //avoid repeat enter
    //enableLoadMore代表是否启动加载更多功能
    if(!enableLoadMore || loadingMore_){
        return;
    }
    loadingMore_ = true;


    //add loadMore view
    if(!loadMoreWidgetItem_){
        loadMoreWidgetItem_ = new QListWidgetItem();
        QSize size = loadMoreWidgetItem_->sizeHint();
        loadMoreWidgetItem_->setSizeHint(QSize(size.width(), 20));
    }
    addItem(loadMoreWidgetItem_);
    setDefaultLoadMoreView();
    setItemWidget( loadMoreWidgetItem_ , loadMoreView_);


    //add callback
    if(loadMoreCallback_){
        loadMoreCallback_();//加载更多接口
    }
}
2,下拉刷新实现

代码同上面1.2的startRefrshing();

void ListWidget::startRefrshing()
{
    //avoid repeat enter
    if( !enableRefreshing_ || refreshing_){
        return;
    }
    refreshing_ = true;


    //add refreshing view
    if(!refreshingWidgetItem_){
        refreshingWidgetItem_ = new QListWidgetItem();
        QSize size = refreshingWidgetItem_->sizeHint();
        refreshingWidgetItem_->setSizeHint(QSize(size.width(), 20));
    }
    insertItem(0 , refreshingWidgetItem_);
    setDefaultRefreshingView();
    setItemWidget( refreshingWidgetItem_ , refreshingView_);


    //add callback
    if(refreshingCallback_){
        refreshingCallback_();//刷新回调接口
    }
}
3,部分效果图

在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值