QML中ListView的高级使用之增加ScrollBar以及设置ScrollBar的样式

本文介绍了如何在QML的ListView中添加ScrollBar并自定义其样式。通过在ListView内部直接使用ScrollBar.vertical,并引入Qt.labs.controls 1.0,可以实现滚动条的颜色、宽度和高度的个性化设置。同时,文章还解决了在同一页面中引入不同控件库导致的冲突问题,提出了通过封装ListView来避免此类冲突的方法。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

用过QML进行列表显示的同仁肯定都知道,QML中的ListView是默认没有ScrollBar的,超出部分的列表项只能通过滚动鼠标滚轮进行显示,但是我们又知道QML中的ScrollView是有ScrollBar的,因此,我们可以通过在ScrollView中嵌入ListView并且重写ScrollView的style来实现列表的显示以及ScrollBar的显示(重写ScrollViewStyle费时费力且效果不佳,请看后面的挫图),这样也同样能够完成鼠标拖动ScrollBar滚动列表,其实现代码大致如下:
ScrollView{
	id:scroll_bar
    style:style:ScrollViewStyle{
		//...
	}
	ListView {
        id: list_view
		anchors.fill: parent
		clip: true
        orientation: ListView.Vertical
		snapMode: ListView.NoSnap
        model: root.model
		delegate: Rectangle {
			//...
		}
	}
}
但是,这样做的一个缺陷是ScrollView的ScrollBar是自带原生的,不能进行自定义显示的,比如想改变ScrollBar的宽度、高度、颜色等,在这种情况下是不能实现的。
其显示效果如下图:

如果我们想改变ScrollBar的样式颜色宽高度,就得另想办法,这里介绍一种很少被人发现的高级用法:ScrollBar.vertical。在Qt的帮助中输入关键字"ScrollBar",阅读帮助可发现ScrollBar的使用必须引入import Qt.labs.controls 1.0(这里有坑,后面有填坑办法^_^),继续阅读,其描述中有这么一句:
---------------------------------------------------------------------------------------
ScrollBar is an interactive bar that can be used to scroll to a specific position. A scroll bar can be either vertical or horizontal, and can be attached to any Flickable, such as ListView and GridView.
---------------------------------------------------------------------------------------
看到这里就有希望了,由于ListView是继承自Flickable的,所以,我们就可以在ListView中直接用ScrollBar来自定义自己的ScrollBar了,其代码如下:
ListView {
    id: list_view
	anchors.fill: parent
	clip        : true
    orientation : ListView.Vertical
	snapMode    : ListView.NoSnap
    model       : root.model
	delegate: Rectangle {
		//...
	}
	ScrollBar.vertical: ScrollBar {
        id: scrollBar
        onActiveChanged: {
            active = true;
        }
        Component.onCompleted: {
            scrollBar.handle.color = "red";
            scrollBar.active = true;
            scrollBar.handle.width = 20;
			scrollBar.handle.height = 100;
        }
    }
}
这样,通过给ScrollBar.vertical设置ScrollBar控件,我们就实现了对ListView的实现滚动条的自定义效果。我们可以设置scrollBar.handle的宽度、高度、以及颜色,达到美化ScrollBar滚动条的目的。
其效果如下图:

跟第一幅图相比,是不是美化多了,而且不费时不费力(^_^上图是有点挫,但是如果在加以美化自定义,就会更美了,关键说明问题就行^_^)。
另外,在上面刚才说了有一处坑,那么是什么坑呢,又怎样填坑呢?
上面说了,ScrollBar的使用必须引入import Qt.labs.controls 1.0,但是假如我们的页面中又引入了import QtQuick.Controls 1.4,那么就存在一个问题,在这个页面中我们在使用Button或Label时,QML就不知道我们到底是用QtQuick库的控件呢还是用Qt.labs库的控件,在Qt帮助中输入关键字"Button"会弹出如下窗口:

意思是QtQuick库和Qt.labs库中都有这个控件,让我们选择呢,那么在使用时,QML当然不知道到底用哪一个,就会导致运行后程序奔溃。
解决以上问题的办法就是对ListView进行简单的封装,在封装的这个qml文件中,我们引入Qt.labs库并且使用ScrollBar给这个ListView做滚动条,代码如下:
import QtQuick 2.5
import Qt.labs.controls 1.0
ListView {
    id: list_area
    anchors.fill: parent
    orientation : ListView.Vertical
    ScrollBar.vertical: ScrollBar {
        id: scrollBar
        onActiveChanged: {
            active = true;
        }
        Component.onCompleted: {
            scrollBar.handle.color = "#686A70";
            scrollBar.active = true;
            scrollBar.handle.width = 10;
        }
    }
}
以上就是封装的整个文件内容,命名为ListViewScrollBar.qml。然后在我们真正使用ListView的qml文件中不要使用原始的ListView,而是使用我们自定义封装的ListViewScrollBar,其他属性正常使用就行了,这样就避免了引入控件库使用控件时冲突导致奔溃了。至此,坑已填平*_*。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

        你是否想用 Python 打造专业桌面客户端?你是否在寻找一门系统全面、案例实战驱动的 QtQuick 视频教程?这门课程就是为你量身定制的!  本课程通过 10大模块、多个实战项目,手把手带你掌握 PySide6 + QtQuick 的核心开发技能,最终实现一个高度还原的「剪映」客户端。无论你是 Python 爱好者,还是 Qt 桌面开发者,这门课都能帮你快速提升!课程亮点一览全平台开发环境搭建(Win11 & macOS)掌握 QML 常用控件与布局深入理解 Python 与 QML 的双向交互掌握 QML 动画与 Canvas 绘图模型-视图-代理 MVD 编程模式玩转 QtQuick3D,轻松构建3D场景完整项目实战:高仿剪映 PC 客户端课程总结+进阶学习路线指导课程章节介绍第1章:开发环境全攻略  从零配置开发环境:Miniconda 安装、PySide6 配置、PyCharm & VS Code 开发调试、macOS 与 Win11 跨平台部署,让你轻松开始 QtQuick 编程之旅!第2章:QML 核心控件全面掌握  掌握 Item、Window、ApplicationWindow 等窗口根对象,文本/图片/按钮、CheckBox、RadioButton、ComboBox、SpinBox等控件的使用,还将实现一个视频进度调节的 Slider与视频播放控件。第3章:布局系统与组件机制  详细讲解行列布局、栅格布局、流式布局、Component、Loader、Repeater 等关键概念,最后实现一个综合案例:自定义电池控件。第4章:Python × JS × QML 高效交互  系统讲解 Python 注册 QML 的四种方式、QML 调用 Python 方法、信号槽机制、值绑定、鼠标/键盘事件处理,让你实现Python 与前端 QML 的无缝通信!第5章:QML 动画系统实战  掌握缩放、旋转、State 状态切换、NumberAnimation 数值动画、Behavior 行为动画、动画控制启动与停止 —— 为你的应用增添高级动态体验!第6章:模型-视图-代理 MVD 精讲  详细解析 ListView、GridView、TableView 等复杂控件使用,配合 DelegateChooser 实现高灵活的代理渲染效果,助力你构建数据驱动的 UI 界面。第7章:Canvas 绘图:打造炫酷 UI  深入 Canvas 编程,绘制路径、圆弧、文本,并结合项目案例,开发一个动态汽车仪表盘,提升界面表现力!第8章:QtQuick3D:迈入三维开发  从 View3D 的基本使用到复杂属性控制,掌握材质、纹理、光照、天空盒、实例化渲染等核心内容,最终完成两个3D项目:3D 茶壶 与 3D 多形态机器人!第9章:项目实战:高仿剪映 PC 客户端  将前面所学内容应用于真实项目,完整实现一个桌面级视频编辑客户端,真正做到学以致用。项目截图如下:  首页  剪辑主窗口  导出窗口第10章:课程总结与进阶建议  回顾全程知识点,规划你的 QtQuick 技术进阶路线,让你少走弯路,技能持续成长!适合人群想快速入门 QtQuick 桌面开发的 Python 开发者有 PyQt / C++ Qt 基础,想转向更现代的 PySide6/QML 开发者UI 工程师、工具开发人员、开源爱好者对剪映客户端等专业项目实现感兴趣的进阶程序员你将获得230页精美课件完整的源代码 & 项目素材持续更新答疑 & 技术支持结课后具备独立构建 QtQuick 应用的能力不止是教程,更是一次实战成长之旅!  立即加入课程,掌握 PySide6 QtQuick 开发的核心技能,开启你的桌面应用进阶之路!
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值