文章目录
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,部分效果图