Qt qml中listview 列表视图控件(下拉刷新、上拉分页、滚动轴)

Qt qml中listview 列表视图控件(下拉刷新、上拉分页、滚动轴)

来源 https://www.cnblogs.com/surfsky/p/4352898.html

设置ListView涉及到将contentsY,即视图的可见部分的顶部,设置y为委托的值。另一个更改是interactive将视图设置为false。这样可以防止视图移动。用户不能再滚动列表或更改当前Item。

contentY为列表上拉后列表左上角点距显示框左上解点的高度
listView1.height为可显示部分的高度,假设列表单元的高度为listViewCellHeight,列表个数为listViewCellCount,则最后个列表单元恰好被显示出来时的条件为 ontentY+listView1.height==listViewCellHeight*listViewCellCount

Qt qml listview下拉刷新和上拉分页主要根据contentY来判断。但要加上顶部下拉指示器、滚动条,并封装成可简单调用的组件,着实花了我不少精力:)

【先看效果】

  

【功能】

 1 下拉刷新和上拉分页逻辑
 2     /下拉刷新
 3     /上拉更多
 4     /滚动栏
 5     /工具栏半拉显隐
 6 Author: surfsky.cnblogs.com
 7 Lisence: MIT 请保留此文档声明
 8 History:
 9     init. surfsky.cnblogs.com, 2015-01
10     add initPosition property. 2015-01

【下载】

http://download.csdn.net/detail/surfsky/8516981

【调用】

控件使用非常简单,只要实现 onLoad 和 onLoadMore 事件即可,其他的和标准的ListView差不多。

 1 /**
 2 新闻示例
 3     下拉刷新
 4     上拉分页
 5     滚动轴
 6     顶部工具栏
 7     顶部工具栏自动吸附
 8     当前行高亮
 9 Author: surfsky.cnblogs.com 2015-01
10 */
11 ListViewEx{
12     id: view
13     width: 500
14     height: 800
15     pageSize: 50
16     snapHeader: true
17     initPosition: ‘header‘
18
19     // 顶部新闻图片栏
20     headerComponent: Component{
21         PageView{
22             id: pv
23             width: view.width
24             height: 100
25             clip: true
26             Rectangle{width:pv.width; height:pv.height; color: ‘green‘}
27             Rectangle{width:pv.width; height:pv.height; color: ‘yellow‘}
28             Rectangle{width:pv.width; height:pv.height; color: ‘blue‘}
29         }
30     }
31
32     // 行UI代理
33     delegate: Text {
34         id: wrapper;
35         width: parent.width;
36         height: 32;
37         font.pointSize: 15;
38         verticalAlignment: Text.AlignVCenter;
39         horizontalAlignment: Text.AlignHCenter;
40         text: content;
41         //color: ListView.view.currentIndex == index ? "white" : "#505050";
42         MouseArea {
43             anchors.fill: parent;
44             onClicked:  wrapper.ListView.view.currentIndex = index;
45         }
46     }
47
48
49     //-----------------------------------------
50     // 数据加载事件
51     //-----------------------------------------
52     onLoad:{
53         for (var i = 0 ; i < pageSize ; ++i)
54             model.append({"index": i, "content": "Item " + i})
55     }
56     onLoadMore:{
57         for (var i = pageSize*page ; i < pageSize*(page+1); ++i)
58             model.append({"index": i, "content": "Item " + i})
59     }
60 }

【核心代码】

实在太长了,截取ContentY处理部分,其他的下载了看吧

 1     //-------------------------------------
 2     // 下拉刷新和上拉分页逻辑
 3     //-------------------------------------
 4     onMovementEnded: {
 5         //console.log("movementEnded: originY:" + originY + ", contentY:" + contentY + ", reflesh:" + needReflesh + ", more:" + needLoadMore);
 6         // 刷新数据
 7         if (needReflesh){
 8             lv.headerItem.goState(‘load‘);
 9             model.reflesh();
10             needReflesh = false;
11         }
12         // 加载新数据
13         else if (needLoadMore){
14             model.loadMore();
15             needLoadMore = false;
16         }
17         else {
18             var h1 = lv.headerItem.loader.height;
19             var h2 = lv.headerItem.indicator.height;
20
21             // 头部区自动显隐(拖动过小隐藏头部,反之显示)
22             if (snapHeader){
23                 if (contentY >= -h1/3 && contentY < 0)
24                     moveToFirst();
25                 if (contentY >= -h1 && contentY < -h1/3)
26                     moveToHeader();
27             }
28             // 刷新区自动显隐
29             if (contentY >=-(h1+h2) && contentY < -h1)
30                 moveToHeader();
31         }
32     }
33     onContentYChanged: {
34         // 下拉刷新判断逻辑:已经到头了,还下拉一定距离
35         if (contentY < originY){
36             var dy = contentY - originY;
37             if (dy < -10){
38                 lv.headerItem.goState(‘ready‘);
39                 needReflesh = true;
40             }
41             else {
42                 if (pressed){
43                     //console.log(pressed);
44                     //needReflesh = false;   // 如何判断当前鼠标是否按下?如果是按下状态才能取消刷新
45                     lv.headerItem.goState(‘‘);
46                 }
47             }
48         }
49         // 上拉加载判断逻辑:已经到底了,还上拉一定距离
50         if (contentHeight>height && contentY-originY > contentHeight-height){
51             var dy = (contentY-originY) - (contentHeight-height);
52             //console.log("y: " + contentY + ", dy: " + dy);
53             if (dy > 40){
54                 needLoadMore = true;
55                 //console.log("originY:" + originY + ", contentY:" + contentY + ", height:" + height + ", contentheight:" + contentHeight);
56             }
57         }
58     }

========== End

原文地址:https://www.cnblogs.com/lsgxeva/p/12629551.html

时间: 2024-12-20 13:06:35

Qt qml中listview 列表视图控件(下拉刷新、上拉分页、滚动轴)的相关文章

win32 sdk列表视图控件两个重要的结构体

列表视图控件是一种非常常用的控件,在需要以报表形式显示数据时,列表控件通常是最好的选择,许多专用的数据报表控件,也是在它的基础上派生而来.与树视图类似,列表控件可以由多个子项目组成,可以设置为Icon(大图标).SmallIcon(小图标).List(列表)或Report(报表). 一.列表视图控件有两个重要的数据结构LVCOLUMN和LVITEM.LVCOLUMN用于定义报表方式下的“列”的结构:LVITEM用于定义“项”的结构.这两个结构的定义及说明如下: typedef struct _L

列表视图控件

设计登陆窗口 首先创建一个图像列表,并通过SetImageList方法将列表视图控件和图像列表关联到一起. CImageList* SetImageList(CImageList* pImageList,int nImageList); pImageList:标识图像列表指针. nImageList:标识图像列表类型. LVSIL_NORMAL:图像列表具有大图标 LVSIL_SMALL:图像列表具有小图标 LVSIL_STATE:图像列表具有状态图标 然后调用InsertItem方法向列表视图

win32 sdk 列表视图控件绘制

[cpp] view plaincopy ////////////////////////////////////////////////////////////// LRESULT ListViewCustomDraw(HWND hwnd, LPARAM lParam) { LPNMHDR pnmh = (LPNMHDR) lParam; if (pnmh->code != NM_CUSTOMDRAW) return 0; LPNMLVCUSTOMDRAW lpNMCustomDraw = (

自个儿写Android的下拉刷新/上拉加载控件 (续)

本文算是对之前的一篇博文<自个儿写Android的下拉刷新/上拉加载控件>的续章,如果有兴趣了解更多的朋友可以先看一看之前的这篇博客. 事实上之所以会有之前的那篇博文的出现,是起因于前段时间自己在写一个练手的App时很快就遇到这种需求.其实我们可以发现类似这样下拉刷新.上拉加载的功能正在变得越来越普遍,可以说如今基本上绝大多数的应用里面都会使用到.当然,随着Android的发展,已经有不少现成的可以实现这种需求的"轮子"供我们使用了. 但转过头想一下想,既然本来就是自己练手

下拉刷新上拉加载控件+Material Design使用

下拉刷新上拉加载控件+Material Design使用 人所缺乏的不是才干而是志向,不是成功的能力而是勤劳的意志. -- 部尔卫 Material Design控件使用 前几天分享了两篇Material Design控件使用的文章,这里就不多做叙述,下面是传送门,想要学习的小伙伴可以去看下: https://juejin.im/entry/58d8d4d344d90400687c134d/detail#comment https://juejin.im/entry/58d9cdf044d904

ListView的下拉刷新上拉加载以及带列的横向滚动

相信有很人做的项目估计都用的到这个.就是ListView的下拉刷新上拉加载还有就是列的横向滚动; PS:横向滚动带表头与固定列(相信蛮多人都有这样的需求吧?就是在ListView上支持很多列,然而设备屏幕宽度有限) PS:这是我个人在网上找的两个示例demo结合而成的一个示例demo,还可以继续拓展,后续有时间就会更新,大家互相学习 ListView下拉刷新上拉加载示例demo原文出处: http://blog.csdn.net/limb99/article/details/18901513 L

重写ListView实现下拉刷新上拉加载

安卓本身的ListView没有刷新功能,要想实现这一功能,就得继承ListView并重写它的方法.同时也要实现其OnScrollListener这一接口. 下拉刷新,需要在原本的ListView上部添加一个Head,ListView本身提供了addHeadView()这一方法,但是没有实现刷新的功能,我们可以自定义Head的内容,并加上刷新的功能. 上拉加载更多数据与下拉刷新类似,是在ListView的下部添加一个Footer.具体实现代码如下: import java.text.SimpleD

Qt qml listview 下拉刷新上拉分页控件

Qt qml listview下拉刷新和上拉分页主要根据contentY来判断.但要加上顶部下拉指示器.滚动条,并封装成可简单调用的组件,着实花了我不少精力:) [先看效果]    [功能] 1 下拉刷新和上拉分页逻辑 2 /下拉刷新 3 /上拉更多 4 /滚动栏 5 /工具栏半拉显隐 6 Author: surfsky.cnblogs.com 7 Lisence: MIT 请保留此文档声明 8 History: 9 init. surfsky.cnblogs.com, 2015-01 10 a

自个儿写Android的下拉刷新/上拉加载控件

前段时间自己写了一个能够"通用"的,支持下拉刷新和上拉加载的自定义控件.可能现如今这已经不新鲜了,但有兴趣的朋友还是可以一起来看看的. 与通常的View配合使用(比如ImageView) 与ListView配合使用 与RecyclerView配合使用 与SrcollView配合使用 局部刷新(但想必这种需要实际应该还是不多的-.) 好啦,效果大概就是这样.如果您看后觉得有一点兴趣.那么,以下是相关的信息: GitHub地址: https://github.com/RawnHwang/S