QScrollBar滚动条、QSlider滑块、 QDial表盘

news2024/10/5 17:18:08

                        

QAbstractSlider 类、 QSCrollBar 类、 QSlider 类
一、 基本原理
1、 QAbstractSlider 继承自 QWidget,该类主要用于提供一个范围内的整数值,
2、 QAbstractSlider 类是 QScrollBar 类(滚动条)QSlider 类(滑块)QDial 类(表盘)的父类,因
此该类的属性和函数对这 3 个类都是可行的。
3、对于滚动条和滑块主要就是对其相关的一些值的设置,对于其外观样式比较单一,所以
动条
滑块的主要功能集中在 QAbstractSlider 类中,这个类提供了滚动条和滑块的共同作
用,主要是对其值作了描述,对于他们的外形,分别由 QScrollBar 类和 QSlider 决定。 所
以单独使用 QAbstractSlider 类什么也干不了,通常需要使用他的子类,若使用 sho()显示
该类的对象,他就是一个空的什么也没有的窗口。
4、注意:滚动条默认是不接受键盘焦点的,要使滚动条接受键盘焦点需使用
QWidget::setFocusPolicy()函数设置焦点策略。
5、滚动条、滑块、表盘的外观样式见下表

二、 最大/最小值和步长
1、 最大/最小值, 步长, 滚动范围,滚动条的滑块大小, 文档长度
1)、 单个步长:是指按一下滚动条(垂直方向)的向上/下箭头或按下键盘的上/下键时滑块
移动的距离。水平方向类似
2)、 页面步长:通常是指在滚动条上按下 page up 和 page down 键时移动的距离。 默认值
通常为 10。
3)、 最大和最小值是个逻辑意义上的值,它们不会改变滑块或滚动条的长度,详见后文。
4)、滚动范围:是指滚动条滑块可移动的距离。滚动范围始终是最大值减去最小值。
具体见下面的图示。

   
2、 滑块像素大小(即实际大小)
1)、 像素大小就是指滑块本身的大小(即使用 resize()函数设置的大小),这个大小是以像素
为单位的,以上讲解的最大/最小值、滚动范围、页面步长、文档长度都是逻辑长度,
是没有单位的。


2)、滑块像素大小受到页面步长的影响,


3)、本小节会把按下 page up 或 page down 时滚动到另一端的次数简称为滚动次数


4)、在不影响滑块像素大小的最小大小和最大大小时,可按如下公式计算(可参阅上一点
的图示)

滚动次数=(最大值 - 最小值) 除以 (页面步长)
滑块像素大小 = (文档长度的像素大小) 除以 (滚动次数 + 1)。

 滚动范围 = 最大值 - 最小值、
 文档逻辑长度=最大值 - 最小值 + 页面步长 = 滚动范围 + 页面步长
 滑块逻辑大小 = 页面步长
 滚动一次的像素距离 = (文档像素大小 - 滑块像素大小) 除以 滚动次数
比如,假设文档像素大小为 40,滚动次数为 1,则滑块像素大小为 20 像素,若滚
动次数为 2,则滑块像素大小为 40/3=13.333 像素。由此可见滚动次数越多,滑块
像素大小就越小,滚动次数越少,滑块像素大小就越大。


5)、当按以上公式计算出来的滑块像素大小小于滑块的最小像素大小时,滑块的像素大小
始终为最小像素大小保持不变。此时滚动次数、最小/最大值、滚动范围都不会改变,
但是文档逻辑长度和滑块逻辑大小不能再按以上公式进行计算。但滚动一次的像素距
离比较好计算,其公式为
滚动一次的像素距离 = (文档像素大小 - 滑块像素最小大小) 除以 滚动次数

三、 跟踪(Tracking)与当前值(Value)、 当前位置(Position)
1、 跟踪:若启用跟踪,则在拖动滑块或滚动条时会发送 valueChanged()信号,若禁用了跟踪,
则只在用户释放滑块或滚动条时,才会发送 valueChanged()信号


2、 当启用了跟踪时,当前值与当前位置是相同的,


3、 若未启用跟踪,则当前值与当前位置是不同的, 原理见下图

四、 QAbstractSlider 类中的属性函数
1、 orientation : Qt::Orientation
访问函数: Qt::Orientation orientation() const; void setOrientation(Qt::Orientation); //槽
设置滚动条或滑块的方向,只能是 Qt::Vertical(默认)或 Qt::Horizontal


2、 sliderDown : bool 访问函数: bool isSliderDown() const; void setSliderDown(bool);
描述滑块是否被按下,设置此属性后在外观上可能会没有变化,但会发送 sliderPressed()
信号


3、 maximum : int 访问函数: int maximum() const; void setMaximum (int);
4、 minimum : int 访问函数: int minimum() const; void setMinimum (int);
设置最大和最小值


6、 pageStep : int 访问函数: int pageStep () const; void setPageStep(int);
页面步长


7、 singleStep : int 访问函数: int singleStep() const; void setSingleStep (int);
单个步长


8、 sliderPosition : int 访问函数: int sliderPosition() const; void setSliderPosition (int);
信号: void sliderMoved(int value);
滑块的当前位置,若启用了跟踪,则此值与 value 属性的值相同。


9、 tracking : bool 访问函数: bool hasTracking () const; void setTracking (bool);
是否启用跟踪,若启用跟踪,则在拖动滑块或滚动条时会发送 valueChanged()信号,若禁
用了跟踪,则只在用户释放滑块或滚动条时,才会发送 valueChanged()信号。


10、 value : int 访问函数: int value()const; void setValue(int); //槽
信号: void valueChanged(int value);
滑块的当前值,该值被强制在最大值和最小值的范围内。


11、 invertedAppearance : bool
访问函数: bool invertedAppearance() const; void setInvertedAppearance (bool);
最大值和最小值是否出现相反的位置,若为 flase(默认),则不反转,若为 true 则反转。
该属性对滑块和表盘(dial)更有意义,对于滚动条则取决于样式,大多数样式会忽略滚动
条的此属性。 具体原理见下图


12、 invertedControls : bool 访问函数: bool invertedControls() const; void setInvertedControls (bool);
是否反转鼠标滚轮和键盘事件,若为 false,则鼠标滚轮向上滚或使用向上键将使值向最
小值调整。 注意:该属性是使用滚轮或键盘上的方向键移动滑块的方向为最大/最小值方
向,且影响的是键盘和鼠标滚轮事件,也就是说该属性不会影响滚动条上的箭头。 具体原
理见下图

                

13、 QAbstractSlider(QWidget *parent = Q_NULLPTR); //构造函数


14、 void setRange(int min, int max); //槽,
设置滑块的最大/最小值与 maximum 和 mimimum 属性相同,只不过使用该函数更方便


15、 void triggerAction(SliderAction action)
触发滑块, SliderAction 枚举见下表,此函数可以用来以编程的方式调整滑块的位置,比
如 triggerAction(QAbstractSlider::SliderPageStepAdd)表示把滑块向最大值方长移动一个页面步长。

QAbstractSlider::SliderAction 枚举(无标志)
作用:描述触发滑块动作的方式
成员说明
QAbstractSlider::SliderNoAction0无动作
QAbstractSlider::SliderSingleStepAdd1向最大值方向移动一个单个步长的距离
QAbstractSlider::SliderSingleStepSub2向最小值方向移动一个单个步长的距离
QAbstractSlider::SliderPageStepAdd3向最大值方向移动一个页面步长的距离
QAbstractSlider::SliderPageStepSub4向最小值方向移动一个页面步长的距离
QAbstractSlider::SliderToMinimum5把滑块移至最小值(home 键)
QAbstractSlider::SliderToMaximum6把滑块移至最大值(end 键)
QAbstractSlider::SliderMove7移动滑块

五、 QAbstractSlider 类中的信号
1、 void rangeChanged(int min, int max)
当最大/最小值改变时,发送此信号。


2、 void sliderMoved(int value)
当 sliderDown 属性为 true,且滑块移动时,发送此信号,即使关闭跟踪(tracking 属性),
也会发送此信号。通常表示用户使用鼠标拖动滑块时,注意:使用键盘方向键或 page up、
page down 或按下滚动条上的向上/下箭头都不会触发该信号,使用鼠标时需要按住滑块再
拖动滑块,才会发送此信号。


3、 void sliderPressed()
4、 void sliderReleased()
当用户用鼠标按下或释放滑块时发送以上信号,可使用 setSliderDown()函数以编程的方式
发送以上信号。 注意,以上信号是鼠标信号,也就是说对键盘可能会无效。


5、 void valueChanged(int value)
滑块的值改变时,发送此信号, tracking 属性对此信号有影响。


6、 void actionTriggered(int action)
触发滑块时发送, action 表示触发滑块时的动作, 见 triggerAction()函数。 比如,若滑快以
是单个步长增长,则 action 为 1(即 QAbstractSlider::SliderSingleStepAdd), 单击 end 可触发
QAbstractSlider::SliderToMaximum,此时 action 为 6,同理单击 home 可触发
QAbstractSlider::SliderToMinimum,使用其他方式不会触发最大/最小值。


六、 QScrollBar 类

1、 QScrollBar 类就只有两个构造函数, 其默认为取值为垂直,最小值为 0,最大值为 100,
单个步长为 1,页面步长为 10,初始位置为 0。 原型如下:
QScrollBar(QWidget *parent = Q_NULLPTR);
QScrollBar(Qt::Qrientation orientation, QWidget *parent = Q_NULLPTR);


七、 QSlider 类
1、 QSlider 类,除了从父类继承来的特性,就仅有刻度线的绘制了,详见下文。
2、 QSlider (QWidget * parent = Q_NULLPTR); //构造函数,默认为垂直。
QSlider (Qt :: Orientation orientation, QWidget * parent = Q_NULLPTR)


3、 tickInterval: int 访问函数: int tickInterval() const; void setTickInterval(int);
刻度线之间的间隔(见右图),间隔值是一个逻辑值而不是像素值,
若为 0(默认),将在单个步长和页面步长之间选择。

                                

4、 tickPosition: TickPosition
访问函数: TickPosition tickPosition() const; void setTickPosition(TickPosition);
描述刻度线的位置,默认为 QSlider::NoTicks(无刻度线),枚举 TickPosition 见下表

QSlider::TickPosition 枚举(无标志)
作用:描述刻度线的位置
成员说明
QSlider::NoTicks0无刻度线
QSlider::TicksBothSides3在两侧绘制刻度线
QSlider::TicksAbove1在(水平)滑块上方绘制刻度线
QSlider::TicksBelow2在(水平)滑块下方绘制刻度线
QSlider::TicksLeftTicksAbove在(垂直)滑块左侧绘制刻度线
QSlider::TicksRightTicksBelow在(垂直)滑块右侧绘制刻度线

八、 QDial 类
1、表盘的原理见下图

2、 QDial 类中的属性

1)、 QDial(QWidget *parent = Q_NULLPTR);    //构造函数
2)、 notchesVisible : bool    访问函数: bool notchesVisible () const;

void setNotchesVisible (bool);

是否显示凹槽(即刻度线),默认为 false(不显示)

3)、 notchSize : const int 访问函数: int notchSize () const;
返回凹槽的大小,凹槽的大小的原理见上图示例,默认为 1。

4)、 notchTarget : qreal 访问函数: qreal notchTarget() const; void setNotchTarget (double);
设置凹槽的像素数,默认为 3.7 像素,为了便于计算,可设置为 1。

5)、 wrapping : bool 访问函数: bool wrapping () const; void setWrapping (bool);
是否开启循环,默认为 false(未开启)

int nMin = 0;
int nMax = 200;
int nSingleStep = 20;
// 微调框
QSpinBox *pSpinBox = new QSpinBox(this);
pSpinBox->move(100, 50);
pSpinBox->setMinimum(nMin);  // 最小值
pSpinBox->setMaximum(nMax);  // 最大值
pSpinBox->setSingleStep(nSingleStep);  // 步长
// 滑动条
QSlider *pSlider = new QSlider(this);
pSlider->move(150, 50);
pSlider->setOrientation(Qt::Horizontal);  // 水平方向
pSlider->setMinimum(nMin);  // 最小值
pSlider->setMaximum(nMax);  // 最大值
pSlider->setSingleStep(nSingleStep);  // 步长		
// 连接信号槽(相互改变)
connect(pSpinBox, SIGNAL(valueChanged(int)), pSlider, SLOT(setValue(int)));
connect(pSlider, SIGNAL(valueChanged(int)), pSpinBox, SLOT(setValue(int)));
pSpinBox->setValue(10);

QSlider *pSlider = new QSlider(this);
pSlider->move(150, 50);
pSlider->setOrientation(Qt::Horizontal);  // 水平方向
pSlider->setMinimum(nMin);  // 最小值
pSlider->setMaximum(nMax);  // 最大值
pSlider->setSingleStep(nSingleStep); // 步长
// pSlider->setTickInterval(40);  // 设置刻度间隔
//描述刻度线的位置
pSlider->setTickPosition(QSlider::TicksAbove);  //QSlider::TicksAbove 刻度在上方

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1015785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能公厕大脑,提高城市公共厕所管理效率!

随着城市建设的不断发展,公共设施的完善也成为人们关注的重要问题之一。而城市公共厕所作为城市治理的一部分,管理效率和运营成本则直接关系到城市环境整体卫生和市民的生活质量。如何提高城市公共厕所管理能力和服务水平,成为城市治理和市民…

MQ的初步了解

目录 什么是MQ? 为什么要用MQ(MQ的优点)? MQ的缺点 常用的MQ产品 MQ使用中的常见问题 什么是MQ? 【1】MQ:MessageQueue,消息队列。 队列,是一种FIFO 先进先出的数据结构。消息由…

28335 GPIO作为输入的配置记录

28335 GPIO配置为输入,可以启动输入滤波功能,看了网上很多的讲解,把滤波配置记录一下: 主要是配置两个参数: GpioCtrlRegs.GPXCTRL.bit.QUALPRDX :用于配置采样的周期,由配置值和SYSCLKOUT共同…

Java面试题之——异常和错误

提示:解释Java中的异常和错误是什么,以及它们之间的区别是什么? 文章目录 前言从定义上来说:从处理方式来看:总结⭐️ 好书推荐 前言 提示:这里可以添加本文要记录的大概内容: 在Java编程语言…

PostgreSQL 如果想知道表中某个条件查询条件在索引中效率 ?

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,SQL Server,Redis ,Oracle ,Oceanbase 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加微信号 liuaustin3 &…

NSS [HNCTF 2022 Week1]Challenge__rce

NSS [HNCTF 2022 Week1]Challenge__rce hint:灵感来源于ctfshow吃瓜杯Y4大佬的题 开题&#xff0c;界面没东西&#xff0c;源码里面有注释&#xff0c;GET传参?hint 传参后返回了源码 <?php error_reporting(0); if (isset($_GET[hint])) {highlight_file(__FILE__); }…

如何判断linux 文件(或lib)是由uclibc还是glibc编译出来的?

工作中使用的编译环境有2套编译器&#xff0c;一个是glibc&#xff0c;一个是uclibc。 有些项目使用的glibc编译的lib&#xff0c;和使用uclibc编译的工程&#xff0c;在一起就会出现reference的编译错误如下&#xff1a; 那和如何来判断一个文件是由哪个编译器编译的呢&#…

苹果cms大橙子vfed 5.0去授权完美破解主题模板

大橙模版算是在苹果 cms 众多主题里&#xff0c;较为亮眼的一款了&#xff0c;主题简洁&#xff0c;功能众多&#xff0c;非常的齐全。 今天分享的就是大橙 5.0 版本模板&#xff0c;自定义菜单输入下列代码使用主题设置和资源采集。 vfed 主题设置&#xff0c;/index.php/la…

MiniApp Dev 6

商城、会员、积分

通过 API 使用 React

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 若使用相同的 Hello World! 应用 &#xff08;通过 React 生成并通过 Visual Studio Code 更新的应用&#xff09;&#x…

微信小程序开发--4.3订阅消息

首先在微信公众平台登录相应的微信小程序&#xff0c;左侧导航栏找到功能&#xff0c;点进去订阅消息&#xff0c;点击开通&#xff0c;点击选用&#xff0c;在公共模板库中选用订阅消息的模板。 js wx.requestSubscribeMessage({tmplIds:[aDRNef2_ty37dXyqVXyUADSyO8BXOZRWYi…

手撕双链表

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大一&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 望小伙伴们点赞&#x1f44d;收藏✨加关注哟&#x1f495;&#x1…

3D视觉到三维视觉之结构光

3D视觉是计算机视觉的终极体现形式 2D视觉技术主要在二维空间下完成工作&#xff0c;三维信息基本上没有得到任何利用&#xff0c;而三维信息才真正能够反映物体和环境的状态&#xff0c;也更接近人类的感知模式。近年来&#xff0c;学术界和工业界推出了一系列优秀的算法和产…

【【萌新的RISC-V学习之再看计算机组成与设计大收获总六】】

萌新的RISC-V学习之再看计算机组成与设计大收获总六 我们在进行设计的时候首先要明白一点 就是 确定我们的设计所需要的 指令的大小和 地址的大小 指令集是32位的 而 地址则一般更多的是64位 数据也是64位 PC与指令寄存器之间的关系 PC是用来保存当前指令的地址。假设地址是0…

Huggingface遇到 Couldn‘t reach xxx on the Hub (ConnectionError)解决方法

文章目录 遇到的问题解决方法参考 遇到的问题 使用服务器下载Huggingface的数据集&#xff0c;显示ConnectionError: Couldn’t reach ‘Salesforce/dialogstudio’ on the Hub (ConnectionError) 具体代码如下&#xff1a; dataset load_dataset("Salesforce/dialogs…

Scanner类用法(学习笔记)

Scanner类用法&#xff08;学习笔记&#xff0c;后续会补充&#xff09; 1.next&#xff08;&#xff09;用法 package com.yushifu.scanner; import java.util.Scanner;//util java工具包 //Scanner类&#xff08;获取用户的输入&#xff09; Scanner s new Scanner&#…

Otter改造 增加springboot模块和HTTP调用功能

环境搭建 & 打包 环境搭建&#xff1a; 进入 $otter_home/lib 目录执行&#xff1a;bash install.sh 打包&#xff1a; 进入$otter_home目录执行&#xff1a;mvn clean install -Dmaven.test.skip -Denvrelease发布包位置&#xff1a;$otter_home/target 项目背景 阿里…

【量化交易】151个量化交易策略解析

我又来推书了~ 今天分享的这本书&#xff0c;量化交易领域的同学们肯定喜欢&#xff08;doge&#xff09;&#xff0c;它就是Zura Kakushadze大佬&#xff08;“Alpha101”作者&#xff09;撰写的《151 Trading Strategies》。&#xff08;文末领&#xff09; 《151 Trading …

创建对象内存分析

package com.mypackage.oop.demo03;public class Pet {String name;int age;//无参构造public void shout(){System.out.println("叫了一声");} }package com.mypackage.oop.demo03;public class Application03 {public static void main(String[] args) {Pet dog n…

vue中el-dialog 中的内容没有预先加载,因此无法获得内部元素的ref 的解决方案 使用强制提前加载dialog方法

问题描述 在没有进行任何操作的时候&#xff0c;使用 this.$refs.xxxx 无法获取el-dialog中的内部元素&#xff0c;这个问题会导致很多bug&#xff0c;其中目前网络上也有许多关于这个问题的解决方案&#xff0c;但是大多数是使用el-dialog中的open在dialog打开的时候使用thi…