QML中ListView数据的分组与定位显示

2023-11-19

在QML中ListView的数据分组与定位显示时,以前使用ListView进行数据分组时,都是在model中加入分组数据(分组的项),然后将model中的数据排好序后全部显示到ListView中,这样做也能达到数据分组的目的,但是数据维护太费力,我们自己好做的事情太多,埋下的隐藏问题也就越多。
这次介绍ListView自身的艺术section属性,可以达到数据分组显示的作用,通过设置如下三个属性:
section.property: "name";
section.criteria: ViewSection.FirstCharacter
section.delegate: sectionHeader
然后实现分组显示的代理sectionHeader,如下:
Component {
        id:sectionHeader
        Rectangle {
            width: parent.width
            height: 20
            color: "steelblue"
            Label {
                text: section
                font.bold: true
                font.pixelSize: 20
                anchors.left: parent.left
                anchors.leftMargin: 10
            }
        }
    }
设置了分组的显示样式,即可实现通过model中的name字段的首字母进行分组显示。话不多说先上图,其初步效果如下:

这里需要注意的是,虽然我们不需要对分组项(上图中的蓝色项)进行管理,但是我们需要对ListModel中要显示数据进行排序管理,不然会出现多个分组,也就是说,section不会自动排序,相同section的model数据必须放在连续的一块,不然的话,不连续的section会分别进行显示,这一点要特别注意(即使这样,也比以前所有的项全都自己管理强的多^_^)。
实现了以上功能后,还想模仿手机的联系人列表,通过右侧的字母进行ListView的定位,如下先展示其完整代码:
import QtQuick 2.5
import QtQuick.Layouts 1.2
import QtQuick.Controls 1.4
import Qt.labs.controls 1.0
import QtQuick.Controls.Styles 1.4


Rectangle {
    id: root
    width: 800
    height: 600
    Component {
        id:sectionHeader
        Rectangle {
            width: parent.width
            height: 20
            color: "steelblue"
            Label {
                text: section
                font.bold: true
                font.pixelSize: 20
                anchors.left: parent.left
                anchors.leftMargin: 10
            }
        }
    }


    Rectangle {
        width: 200
        height: 300
        anchors.centerIn: parent
        color: "grey"


        ListView {
            id: list_view
            anchors.fill: parent
            clip: true
            anchors.margins: 5
            model: list_model
            delegate: Rectangle {
                height: 30
                width: parent.width
                Label {
                    text: name
                    anchors.centerIn: parent
                    color: "green"
                }
            }


            section.property: "name";
            section.criteria: ViewSection.FirstCharacter//ViewSection.FullString
            section.delegate: sectionHeader


            ScrollBar.vertical: ScrollBar {
                id: scrollBar
                onActiveChanged: {
                    active = true;
                }
                Component.onCompleted: {
                    scrollBar.handle.color = "red";
                    scrollBar.active = true;
                    scrollBar.handle.width = 10;
                }
            }
        }


        Rectangle {
            id: lab
            width: 30
            height: width
            color: "red";
            radius: width/2
            opacity: 0.8
            anchors.centerIn: parent
            Label {
                id: curLabel
                font.pixelSize: 26
                font.bold: true
                anchors.centerIn: parent
            }
            visible: false
        }


        Rectangle {
            width: 10
            height: parent.height-100
            anchors.right: parent.right
            anchors.rightMargin: 10
            color: "transparent"
            anchors.verticalCenter: parent.verticalCenter
            Column {
                anchors.centerIn: parent
                spacing: 3
                clip: true
                Repeater {
                    model: ["a","b","c","d","e","f","g","h","i","j","k"]
                    Label {
                        text: modelData
                        font.pixelSize: 16
                        horizontalAlignment: Text.AlignHCenter
                        verticalAlignment: Text.AlignVCenter


                        MouseArea {
                            anchors.fill: parent
                            hoverEnabled: true
                            onEntered: {
                                console.log("onClicked:", modelData);
                                var idx = getIndexFromLab(modelData);
                                list_view.positionViewAtIndex(idx, ListView.Beginning)


                                lab.visible = true;
                                curLabel.text = modelData
                            }
                            onExited: lab.visible = false;
                        }
                    }
                }
            }
        }
    }


    function getIndexFromLab(lab)
    {
        var i;
        for (i=0;i<list_model.count;i++)
        {
            if (list_model.get(i).name.substr(0, 1) === lab)
            {
                return i;
            }
        }
        return i<=11?i:7;
    }


	//测试数据
    ListModel{
        id:list_model
        ListElement {
            name: "aItem1"
        }
        ListElement {
            name: "aItem2"
        }
        ListElement {
            name: "aItem3"
        }
        ListElement {
            name: "bItem4"
        }
        ListElement {
            name: "bItem5"
        }
        ListElement {
            name: "cItem6"
        }
        ListElement {
            name: "cItem7"
        }
        ListElement {
            name: "tItem8"
        }
        ListElement {
            name: "tItem9"
        }
        ListElement {
            name: "tItem10"
        }
        ListElement {
            name: "wItem11"
        }
        ListElement {
            name: "wItem12"
        }
        ListElement {
            name: "wItem13"
        }
        ListElement {
            name: "zItem14"
        }
        ListElement {
            name: "zItem151"
        }
    }
}
以上代码中,不仅实现了model中数据的分组,还通过鼠标滑动到右侧的字母上时自动定位ListView的显示,主要使用了Repeater控件进行分组字母的显示,通过计算鼠标当前在Repeater中的那个字母上,得出ListView中应该展示的索引(这里没有进行详细的计算,只是初步计算,要想精确定位,在这块还得继续优化,请参见下一篇 JS递归调用定位ListView应该定位的项),然后调用ListView的positionViewAtIndex(idx, ListView.Beginning)进行显示的定位,其实现效果如下:

​如上图,当鼠标在"c"上时,分组自动定位到C分组,中间的红圆形显示当前显示分组的字母,这样,完美实现了数据的分组显示与定位^_^。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QML中ListView数据的分组与定位显示 的相关文章

  • Android 列表视图与部分

    您好 我在尝试了解分段列表视图的工作原理时遇到问题 我让它工作到正常的列表视图中 但现在我想将部分添加到我的列表中 如何在其中添加节标题 这是我有效的代码 public class ChooseTeamActivity extends Li
  • 列表下方的按钮不显示

    我终于设法让我的列表正确显示 http stackoverflow com questions 5662277 how to line up intger output in custom android dialog https i st
  • ListView 的转换视图类型 BaseAdapter 错误

    我有一个使用不同类型的视图行的列表视图适配器 大多数时候它工作得很好 但是当我从列表中删除一个元素时它会崩溃 它将错误类型的convertView发送到getView public View getView int position Vie
  • android appwidget listview不更新

    我编写了一个 AppWidget 它在 ListView 中显示来自 ContentProvider 的一些数据 但我在更新它时遇到了问题 当我第一次创建小部件时 它会正确填充 但在 AlarmManager 的 PendingIntent
  • 使用自定义视图填充 ListFragments?

    以前 我可以将布局扩展为 ListView 的自定义视图层次结构 但我不知道如何对 listFragment 执行相同的操作 假设我有一个 item list 布局 其中有一个 ImageView 和 2 个文本视图 我想将其膨胀以在我的
  • Android ListView 填充内容而不移动 ListView 高度?

    我有一个 ListView 里面有一堆项目 如何使顶部和底部项目的顶部边距为 10dp 底部项目的底部边距为 10dp 现在我可以通过 ListView 上的填充或边距来做到这一点 但结果是 当您滚动时 ListView 的边缘现在距屏幕底
  • 使用数组适配器对列表视图进行排序

    我有一个连接到自定义数组适配器的列表视图 此列表显示 TCP 连接接收到的信息 这些信息会更改数据集 我可以对列表视图进行排序sort Comparator
  • 在 Windows 10 UWP 应用程序中创建可滑动的 ListView,例如在地图应用程序中

    我正在创建 UWP 应用程序 我需要在滑动菜单中显示一系列结果 滑动菜单可滚动并且可以滑动改变其高度就像 Windows 10 Mobile 中的地图应用程序中的搜索结果一样 我找不到任何教程来创建这样的体验 提前致谢 您也可以使用User
  • 具有多个 Item 布局的 ListView 适配器

    我正在考虑向我的 Android 应用程序添加一个带有缩略图的列表视图 左边是缩略图 右边是文字 有没有办法用单独的 xml 文件填充列表视图 例如 我可以为奥地利 英国 美国等提供单独的 xml 并将它们添加到列表视图中吗 我问的原因是
  • 自定义列表视图的选择器“更改 ListView 背景 - 奇怪的行为”

    我正在用这个教程 http www androidpeople com android custom listview tutorial example part 2 我想为此列表视图添加选择器 我尝试了一些代码 但它不起作用 我该怎么做
  • 如何使用listview.GetItemAtPosition(e.Position)获取用户点击的ListView项目的数据?

    在 Xamarin Android 应用程序中 我有一个之前填充的 ListView 在正确触发的 listview ItemClick 事件处理程序中 我想检索单击的 listview item 视图的文本 以便在 AlertDialog
  • 如何获取android中listview特定项目的id?

    我在用Listview并设置多个项目 每个项目都有喜欢 分享和评论选项 实际上我已经获取了 Item Id 并且还setText of TextView 成功了 但无法在特定项目的 Like 按钮单击事件上获取项目 ID 如何获取每个项目的
  • 为什么文件传输完成后我的列表视图条目的内容没有更新?

    为什么将文件复制到目录后listview没有更新驻留在该目录中的较新内容 仅当我退出时listview重新进入视图会刷新吗 有人可以告诉我如何解决这个问题吗 文件功能java文件的复制 您应该将新复制的文件 VideoInfo对象 添加到您
  • 如何允许用户对列表中的项目重新排序?

    我有一个 Android 应用程序 用户可以在其中将项目添加到列表中 并且我希望他们能够按照自己的意愿对列表中的项目进行重新排序 而不是仅仅向他们提供不同的排序顺序 为项目添加位置设置 它们来自数据库 很容易 但是用户可以使用哪种 UI 元
  • 如何在 Android 中隐藏列表视图中的项目

    我知道 这个问题以前曾被问过 但我还没有看到有效的答案 有什么办法可以隐藏一些项目ListView不改变源数据 我尝试将项目视图的可见性设置为消失 它不会再显示 但为此项目保留的位置仍然存在 我还设置了 android dividerHei
  • 当用户拖动列表视图项目时检测何时需要滚动

    介绍 我正在实现列表视图项目的重新排列 而不使用 OLE 拖放 PROBLEM 我已经成功解决了大部分任务 除了当用户想要将项目放置在当前不可见的位置时向上 向下滚动之外 问题 我可以使用以下消息向上 向下滚动列表视图 SendMessag
  • 停止在列表视图中滚动

    我的活动中有一个列表视图和一个图像按钮 当我单击图像按钮时 我想转到列表中的特定位置 我通过调用列表上的 setSelection intposition 来实现此目的 当用户滑动列表视图然后单击图像按钮时会出现问题 列表将转到指定位置但继
  • 使用本地 JSON 数据填充 jQuery Mobile ListView

    我正在尝试使用本地 JSON 信息填充 JQM ListView 但是 不会创建任何列表项 任何帮助 将不胜感激 这是我的代码 JSON 文件结构 name test calories 1000 fat 100 protein 100 ca
  • 如何在模型更改时停止ListView“跳跃”

    我需要做什么 我需要创建一个聊天窗口用一个ListView在 QML 中存储聊天消息 我设置listView positionViewAtEnd 以便跟踪最后的消息 我禁用positionViewAtEnd当我向上滚动时 我可以阅读过去的消
  • 在android中从JSON生成listview

    我对 Android 完全陌生 目前正在尝试从从我的服务器中提取的 JSON 数组生成列表视图 我已经阅读了很多教程 但没有运气 有一种独特的方法可以做到这一点 请您指出一些适合开始的资源 我读过了this http www josecgo

随机推荐

  • Linux网络编程之Tcp(内含服务器、客户端代码实例)

    文章目录 前言 Tcp模型 服务器端 客户机端 代码 运行结果 结束 前言 本节讲解需要相关的网络基础知识 如果缺少相关知识 请先学习 Linux网络编程之网络基础 和 Linux网络编程之网络基础2 Tcp模型 先打开我们之前讲过的Tcp
  • CVE-2021-40444漏洞复现详细

    2021年9月8日 微软官方发布了MSHTML组件的风险通告 漏洞编号 CVE 2021 40444 未经身份验证的攻击者可以利用该漏洞在目标系统上远程执行代码 微软官方表示已经监测到该漏洞存在在野利用 1 漏洞详情 Microsoft M
  • js 本地存储和获取

    localStorage setItem temp orderAr 存入 参数 1 调用的值 2 所要存入的数据 console log localStorage getItem temp 输出
  • 安装用jieba,实现用TF-IDF算法进行关键词的提取

    文本知识提取 目录 1 安装jieba 2 TF IDF算法 2 1算法的定义 2 2算法的应用 1 词性标注 2 去停用词 3 关键词提取 1 安装jieba Jieba分词官网 https github com fxsjy jieba
  • 基于k8s的微服务一键部署解决方案

    父项目msagd配置 编写pom xml的属性标签
  • Day8_8 Java学习之List集合类

    目录 一 List集合的概述 ArrayList集合类的概述 ArrayList集合的语法定义 ArrayList集合的常用方法 LinkedList集合概述 LinkedList集合的语法定义 LinkedList集合类常用方法 二 Se
  • Unity项目资源加载管理简易框架(Resource)

    文章目录 一 背景 二 思路概述 三 具体实现代码及其思路梳理 1 资源路径 2 资源管理 3 资源加载 4 资源管理 四 说明 一 背景 在Unity的轻量型项目中如果对优化没有特别搞得要求 如果需要用到Resource Load这个接口
  • 算高差改正数的计算机程序,水准测量中测量高差的改正数怎么计算?

    原标题 水准测量中测量高差的改正数怎么计算 工程测量中 高速铁路 城市轨道涉及到二等水准 一般铁路涉及三 四等水准 高速公路 房建 市政一般采用四等水准 沉降观测各等级均涉及 在水准测量中高差的改正三四等水准需要进行水准标尺长度改正 正常水
  • 基于51单片机简易电子琴设计(含Keil程序和Proteus文件)

    一 系统概述 系统使用的模块有AT89C51单片机 8位共阳数码管 矩阵键盘 小灯 按键 蜂鸣器 本次设计的电子琴系统以AT89C51单片机为控制核心 使用数码管显示音符 右侧的矩阵键盘可以理解为琴键 按下不同的按键就能显示不同的音符 按下
  • 最新服务器CPUe5,看这里!2019 至强 Xeon E5 服务器系列 CPU 天梯图分享

    排名名称评分 1Intel Xeon E5 2679 v4 2 50GHz25 236 2Intel Xeon E5 2699 v4 2 20GHz23 200 3Intel Xeon E5 2696 v3 2 30GHz22 548 4I
  • LNCS用户写作指南【 Springer Computer Science Proceedings 】

    转自 http blog csdn net wyskys article details 18075471 重点是文末的参考文献格式 主要的是 链接 期刊论文 会议论文的引用格式 下載地址 http static springer com
  • Jsoup 抓取网页内容demo

    1 代码 public Document getDocument String url try return Jsoup connect url get catch IOException e e printStackTrace retur
  • 为什么电脑的时间总是快2分钟

    由于工作需要 今天领到一台新的笔记本 轻轻地抚摸 新伙伴 的同时 发现笔记本的时间 快了2分钟 o o表情 明明已经联网了 为啥还是快两分钟呢 于是我就一顿操作猛如虎 结果一看 服务器连接的是 time windows com 这可不行 我
  • 【Linux】Ubuntu系统下用apt命令删除/卸载软件包

    大家都知道 在ubuntu中安装一个新的软件包时 直接使用sudo apt get install命令就好 那么 如果要卸载或者删除一个软件包呢 1 删除为了满足依赖而安装的 但现在不再需要的软件包 包括已安装包 保留配置文件 这个命令容易
  • C/C++编程题开头字符串、数据输入几种写法

    1 题设 在IT公司编程题中 多数会让你一并写上测试数据输入和结果输出的Demo 这也是程序员基本的功底 想一想如果连自己的测试数据都无法给入 后面的算法写的再好 也无法测试它的准确性和效果 下面分别从c c 以及字符串输入和数组输入 来谈
  • Python 多线程、线程池、进程池

    线程间的通讯机制 消息队列 event 事件对象 当线程创建完成之后 并不会马上执行线程 而是等待某一事件发生 线程才会启动 import threading 创建 event 对象 event threading Event 重置代码中的
  • BeyondCompare破解版的下载安装

    目前Beyond Compare的版本已经支持到4 2的release版本 官网 https www scootersoftware com download php 支持 windows mac linux版本 这里我们选择的mac版本
  • android设置白天模式和夜间模式

    if isDay AppCompatDelegate setDefaultNightMode AppCompatDelegate MODE NIGHT YES else AppCompatDelegate setDefaultNightMo
  • python3GUI--抖音无水印视频下载工具(附源码)

    文章目录 一 准备工作 二 预览 0 复制抖音分享短链接 1 启动 2 运行 3 结果 三 设计流程 1 总体设计 2 详细设计 四 源代码 五 说明 总结 hello 大家好啊 失踪人口回归了 捂脸 本次使用tkinter撰写一篇 抖音无
  • QML中ListView数据的分组与定位显示

    在QML中ListView的数据分组与定位显示时 以前使用ListView进行数据分组时 都是在model中加入分组数据 分组的项 然后将model中的数据排好序后全部显示到ListView中 这样做也能达到数据分组的目的 但是数据维护太费