【Qt】输入类控件2——SpinBox,DateEdit,TimeEdit,Dial,Slider
目录
一.SpinBox
1.1.核心属性
1.2.核心信号
1.3.示例1——调整⻨当劳购物⻋中的份数.
二.DateEdit &TimeEdit
2.1.核心属性
2.2.核心信号
2.3.示例1——实现日期计算器
三.Dial
3.1.核心属性
3.2.核心信号
3.3.代码示例一——调整窗口透明度
四.Slider
4.1.核心属性
4.2.核心信号
4.3.示例1——调整窗口大小
4.4.示例2——通过⾃定义快捷键调整滑动条位置
一.SpinBox
使⽤ QSpinBox 或者 QDoubleSpinBox 表⽰"微调框",它是带有按钮的输⼊框,可以⽤来输⼊整 数/浮点数。
通过点击按钮来修改数值⼤⼩.
由于 QSpinBox 和 QDoubleSpinBox ⽤法基本相同,就只介绍 SpinBox 的使⽤了.
1.1.核心属性
1. value(数值)
-
说明:这是
QSpinBox
最核心的属性,它代表了控件当前存储和显示的实际数值。 -
行为:所有操作(点击按钮、键盘输入、程序设置)最终都会改变这个值。该值严格受到
minimum
(最小值)和maximum
(最大值)的限制。当value
改变时,会发出valueChanged()
信号。
2. singleStep(单步步长)
-
说明:定义用户每次点击向上或向下按钮时,数值增加或减少的量。
-
示例:如果
singleStep
设为 10,当前值为 5,点击一次向上按钮,值将变为 15。 -
用途:用于控制数值调整的粒度。
3. displayIntegerBase(显示进制)
-
说明:控制数值在界面上的显示格式,即使用多少进制来呈现数字。
-
示例:
-
设为
10
:显示为我们日常使用的十进制(如 10, 11, 12)。 -
设为
2
:显示为二进制(如 1010, 1011, 1100)。
-
-
重要提示:这个属性只改变显示方式,
value
属性本身存储的仍然是十进制的数值。
4. minimum(最小值)
-
说明:定义了
QSpinBox
所允许的数值下限。 -
行为:用户无法通过任何操作(输入或点击)将
value
设置为比minimum
更小的值。如果尝试通过程序设置一个小于minimum
的值,value
会被自动修正为minimum
。
5. maximum(最大值)
-
说明:定义了
QSpinBox
所允许的数值上限。 -
行为:与
minimum
相对,用户无法将value
设置为比maximum
更大的值。
6. suffix(后缀)
-
说明:在显示的数值后面添加一个固定的文本字符串。
-
示例:如果
value
是 90,suffix
设为"°"
,则 SpinBox 中会显示90°
。常用于表示单位(如度、厘米、元)。
7. prefix(前缀)
-
说明:在显示的数值前面添加一个固定的文本字符串。
-
示例:如果
value
是 100,prefix
设为"¥"
,则 SpinBox 中会显示¥100
。常用于表示货币符号等。
8. wrapping(循环)
-
说明:一个布尔值,控制当数值达到边界时是否循环。
-
行为:
-
设为
true
(启用):当数值已经是maximum
时,再点击向上按钮,数值会跳转到minimum
;反之,当数值是minimum
时点击向下按钮,会跳转到maximum
。 -
设为
false
(禁用,默认):当数值达到边界时,相应的按钮会变灰,无法再向该方向调整。
-
9. frame(边框)
-
说明:一个布尔值,控制是否绘制
QSpinBox
外部的边框。 -
行为:设为
true
(默认)时,有一个明显的边框;设为false
时,控件看起来是扁平、无边框的。
10. alignment(对齐方式)
-
说明:控制 SpinBox 文本框内内容的对齐方式。
-
可选值:如左对齐(
Qt::AlignLeft
)、居中对齐(Qt::AlignCenter
)、右对齐(Qt::AlignRight
)等。 -
用途:通常设置为右对齐,符合数字输入的习惯。
11. readOnly(只读)
-
说明:控制用户是否能够编辑 SpinBox 的内容。
-
行为:
-
设为
true
:用户不能通过键盘直接输入数值,只能通过上下按钮来调整。控件背景通常显示为灰色。 -
设为
false
(默认):用户既可以点击按钮也可以直接输入。
-
12. buttonSymbols(按钮符号)
-
说明:定义上下按钮上显示的图标样式。
-
可选值:
-
UpDownArrows(上下箭头):按钮上显示三角形箭头(默认)。
-
PlusMinus(加减号):按钮上显示
+
和-
符号。 -
NoButtons(无按钮):完全不显示调整按钮,用户只能通过键盘输入或编程方式改变值。
-
13. accelerated(加速)
-
说明:一个布尔值,控制当用户长时间按住调整按钮时,数值的变化速度是否会加速。
-
行为:
-
设为
true
(启用):按住按钮不放,数值会先按singleStep
正常变化,一段时间后变化速度会显著加快,便于快速调整大范围的数值。 -
设为
false
(禁用):无论按住多久,数值都始终以singleStep
的恒定速度变化。
-
14. correctionMode(修正模式)
-
说明:定义当用户输入了一个无效值(如超出范围)后,控件如何自动修正。
-
可选值:
-
CorrectToPreviousValue(修正为上一个值):如果输入无效,SpinBox 会自动恢复到此输入之前的那个有效值。
-
CorrectToNearestValue(修正为最接近的值):如果输入无效,SpinBox 会将其自动修正为最接近的有效值(通常是
minimum
或maximum
)。
-
15. keyboardTracking(键盘跟踪)
-
说明:一个非常重要的布尔属性,控制在键盘输入过程中,
valueChanged()
信号何时被发出。 -
行为:
-
设为
true
(启用,默认):每键入一个数字,value
会立即更新并发出valueChanged()
信号。例如,想输入 "100",输入 "1" 时值变为 1(触发信号),输入 "10" 时值变为 10(又触发信号),输入 "100" 时值变为 100(再次触发信号)。 -
设为
false
(禁用):只有在用户完成输入,比如按下回车键或 SpinBox 失去焦点时,value
才会最终更新,并只发出一次valueChanged()
信号。
-
1.2.核心信号
1. valueChanged(int)
触发时机
当 QSpinBox
的数值发生改变时就会立即触发这个信号。这里的"数值改变"包括:
-
点击上下调整按钮
-
使用键盘的上下箭头键
-
直接通过键盘输入新数值
-
通过程序代码设置新的
value
参数含义
-
参数类型:
int
(整数) -
参数内容:当前的纯数值,不包含任何前后缀文本
-
特点:这是最直接、最常用的信号,因为你通常关心的是实际的数值变化
示例说明
假设有一个 SpinBox:
-
prefix
: "¥" -
suffix
: "元" -
value
: 100
当用户将数值从 100 改为 200 时:
-
触发
valueChanged(200)
信号 -
参数就是纯数字
200
2. textChanged(QString)
触发时机
当 QSpinBox
中显示的文本内容发生改变时就会触发这个信号。
参数含义
-
参数类型:
QString
(字符串) -
参数内容:完整的显示文本,包括前缀和后缀
-
特点:这个信号关注的是"显示效果"而非"数值本身"
示例说明
同样假设 SpinBox:
-
prefix
: "¥" -
suffix
: "元" -
value
: 100 → 显示为 "¥100元"
当数值从 100 改为 200 时:
-
触发
textChanged("¥200元")
信号 -
参数是完整的格式化字符串
重要细节
这个信号的触发可能比 valueChanged 更频繁,因为:
-
在用户输入过程中,每键入一个字符,显示文本就会变化一次
-
即使最终数值没有改变(比如用户输入了无效值又被自动修正),文本也可能经历变化
1.3.示例1——调整⻨当劳购物⻋中的份数.
我们创建一个新项目
我们创建下面这些东西来
它们的objectname是
编写代码,修改widget.cpp,给下拉框设置初始值
我们运行一下
点击确认
二.DateEdit &TimeEdit
现在我们要讲的是下面这3个啊
使⽤ QDateEdit 作为⽇期的微调框.
使⽤ QTimeEdit 作为时间的微调框.
使⽤ QDateTimeEdit 作为时间⽇期的微调框.
这⼏个控件⽤法⾮常相似,我们以 QDateTimeEdit 为例进⾏介绍
2.1.核心属性
1. dateTime(日期时间)
这个属性是控件最核心的值,它代表了用户选择或程序设置的 完整的日期和时间。它就像一个包含年、月、日、时、分、秒的复合值。
-
功能:获取或设置控件当前显示的完整日期和时间。
-
示例:你可以将它设置为
2000年1月1日凌晨0点0分0秒
,那么控件就会显示出这个完整的信息。 -
关系:
date
和time
属性本质上是从dateTime
中拆分出来的部分。当你修改dateTime
时,date
和time
也会自动更新。
2. date(日期)
这个属性只关注 dateTime
中的 日期部分(年、月、日),而忽略时间部分。
-
功能:专门用于获取或设置控件中的日期。当你只关心“哪一天”而不关心具体时间点时,使用这个属性非常方便。
-
示例:如果
dateTime
是2001年1月1日下午2点30分
,那么date
属性就是2001年1月1日
。 -
操作影响:如果你只修改了
date
(例如从1月1日改成1月2日),那么时间部分(下午2点30分)会保持不变,整个dateTime
会更新为2001年1月2日下午2点30分
。
3. time(时间)
与 date
属性相反,这个属性只关注 dateTime
中的 时间部分(时、分、秒),而忽略日期部分。
-
功能:专门用于获取或设置控件中的时间。当你只关心“几点几分”而不关心具体日期时,就使用这个属性。
-
示例:如果
dateTime
是2001年1月1日凌晨0点0分0秒
,那么time
属性就是0点0分0秒
。 -
操作影响:如果你只修改了
time
(例如从0点0分改成10点30分),那么日期部分(2001年1月1日)会保持不变,整个dateTime
会更新为2001年1月1日上午10点30分
。
4. displayFormat(显示格式)
这个属性控制着日期和时间在输入框中的 显示样式。它使用特定的字母组合作为占位符来定义格式。
-
功能:定制化日期时间的显示方式,使其符合不同地区或用户的习惯。
-
核心规则:
-
y
代表年份(yy
显示两位年,yyyy
显示四位年)。 -
M
代表月份(M
显示无前导零的月,MM
显示有前导零的月)。 -
d
代表日期(d
显示无前导零的日,dd
显示有前导零的日)。 -
H
代表24小时制的小时。 -
m
代表分钟。 -
s
代表秒钟。
-
-
示例:格式
yyyy-MM-dd HH:mm:ss
会显示为2001-01-01 14:05:30
。而格式dd/MM/yyyy
则会显示为01/01/2001
。这非常重要:不同的库或语言对格式符号的定义可能不同,使用时务必查阅当前环境的文档。
5. minimumDateTime(最小日期时间) 和 maximumDateTime(最大日期时间)
这两个属性共同定义了用户可以选择的一个 有效范围。
-
功能:限制用户输入或选择的日期时间不能超出设定的最小值和最大值。
-
minimumDateTime(最小):用户不能选择比这个值更早的日期时间。
-
maximumDateTime(最大):用户不能选择比这个值更晚的日期时间。
-
应用场景:例如,在设置会议时间时,可以限制不能选择今天之前的时间;在设置生日时,可以限制不能选择今天之后的日期。这提供了数据有效性的基本保障。
6. timeSpec(时间规范)
这个属性定义了控件中的日期时间值所遵循的 时区或时间标准。
-
功能:指明时间是基于本地时间、全球标准时间还是其他时区偏移。
-
常见取值:
-
Qt::LocalTime
(本地时间):这是最常用的设置。它表示时间值是基于运行程序的计算机所设置的本地时区。例如,如果你在北京(UTC+8),那么你看到的时间就是北京时间。 -
Qt::UTC
(协调世界时):表示时间值是全球统一的标准时间(格林威治标准时间)。它不考虑任何时区偏移。通常用于需要绝对时间标准的系统(如日志记录、服务器通信)。 -
Qt::OffsetFromUTC
(相对于UTC的偏移):表示时间值是相对于UTC有一个固定的小时偏移量。例如,你可以设置为 UTC+8 来表示东八区的时间。这在你需要处理一个特定时区(非本地时区)的时间时非常有用。
-
关于本地时间(LocalTime)和协调世界时(UTC)
1. 协调世界时(UTC):世界的“绝对时间尺”
您可以把 UTC 想象成全世界唯一的一把“标准尺”,用来度量时间。
-
科学性:正如您所说,它是由遍布全球的原子钟加权平均计算出来的,极其精确和稳定,不受地球自转微小变化的影响。它是真正的科学标准。
-
全球统一:无论你身处地球的哪个角落,UTC时间此刻的值都是唯一的。例如,如果此刻UTC时间是
10:00
,那么在全球任何地方,此刻的UTC时间都是10:00
。 -
计算机的“母语”:计算机操作系统内部,为了统一和避免歧义,通常使用UTC时间来存储和计算时间。当程序需要记录一个时间点(比如文件创建时间、日志记录时间),最佳实践就是将其转换为UTC时间再存储。
2. 本地时间:UTC在特定地区的“翻译版本”
而 本地时间 则是为了人类生活的便利,对UTC时间进行的“翻译”。
-
基于时区:地球被划分为24个主要时区,每个时区相对于UTC有一个固定的时间偏移量。这个偏移量通常是整数小时,但也有半小时或45分钟的特殊情况(如印度、尼泊尔)。
-
偏移规则:时区以本初子午线(0度经线,位于英国格林威治)为基准,向东增加,向西减少。
-
东区(+):比UTC时间早。例如:北京时间(东八区)是 UTC+8。当UTC是凌晨2点时,北京时间是当天上午10点(2 + 8 = 10)。
-
西区(-):比UTC时间晚。例如:美国东部时间(EST)是 UTC-5。当UTC是下午4点时,美国东部时间是当天上午11点(16 - 5 = 11)。
-
-
夏令时:为了让人们更好地利用夏季日照,许多地区会在夏季将时间拨快一小时(例如从UTC+8变为UTC+9),秋季再拨回来。这增加了本地时间计算的复杂性,但UTC本身不受此影响。
2.2.核心信号
1. dateChanged(QDate)
-
字面意思:日期改变。
-
触发时机:当控件中的 日期部分(年、月、日) 发生改变,而 时间部分(时、分、秒) 保持不变时,这个信号就会被触发。
-
详细描述:
这个信号只关心“日期”。比如,用户通过鼠标点击或键盘输入,将日期从“2023年10月1日”修改为“2023年10月2日”,但时间始终是“12:00”,那么dateChanged
信号就会发出。它携带一个QDate
类型的参数,这个参数包含了改变后的新日期值。 -
适用场景:
当你只关心日期变化,而不在意具体时间时。例如,在一个酒店预订应用中,用户选择“入住日期”,你只需要根据新的日期来更新可用的房型和价格,而不需要关心是几点入住(入住时间通常是固定的),这时就适合监听dateChanged
信号。 -
示例:
-
改变前:2023-10-01 14:30:00
-
改变后:2023-10-02 14:30:00 (日期变了,时间没变)
-
结果:会触发
dateChanged
信号。
-
2. timeChanged(QTime)
-
字面意思:时间改变。
-
触发时机:当控件中的 时间部分(时、分、秒) 发生改变,而 日期部分(年、月、日) 保持不变时,这个信号就会被触发。
-
详细描述:
这个信号只关心“时间”。比如,用户将时间从“下午2:30”调整到“下午3:00”,但日期仍然是“2023年10月1日”,那么timeChanged
信号就会发出。它携带一个QTime
类型的参数,这个参数包含了改变后的新时间值。 -
适用场景:
当你只关心时间变化,而不在意具体日期时。例如,在一个闹钟设置界面,用户只设置闹钟响起的“时间”(几点几分),日期通常是当天或一个重复规则,这时监听timeChanged
信号就很合适。 -
示例:
-
改变前:2023-10-01 14:30:00
-
改变后:2023-10-01 15:00:00 (日期没变,时间变了)
-
结果:会触发
timeChanged
信号。
-
3. dateTimeChanged(QDateTime)
-
字面意思:日期时间改变。
-
触发时机:当控件中的 日期部分 或 时间部分,任意一个 发生改变时,这个信号都会被触发。也就是说,它是最敏感的一个信号。
-
详细描述:
这个信号同时关心“日期”和“时间”的整体状态。无论是日期变了、时间变了,还是两者都变了,它都会发出通知。它携带一个QDateTime
类型的参数,这个参数包含了改变后的完整的日期和时间值。 -
适用场景:
当你需要时刻关注日期时间控件的完整值,任何细微改动都需要响应时。例如,在一个会议安排系统中,修改“会议开始时间”,无论是改了日期还是具体钟点,都需要立即更新日程表的显示或检查时间冲突,这时就应该使用dateTimeChanged
信号。 -
示例:
-
情况一:改变日期(时间不变)
-
改变前:2023-10-01 14:30:00
-
改变后:2023-10-02 14:30:00
-
结果:会触发
dateTimeChanged
信号(同时也会触发dateChanged
)。
-
-
情况二:改变时间(日期不变)
-
改变前:2023-10-01 14:30:00
-
改变后:2023-10-01 15:00:00
-
结果:会触发
dateTimeChanged
信号(同时也会触发timeChanged
)。
-
-
情况三:同时改变日期和时间
-
改变前:2023-10-01 14:30:00
-
改变后:2023-10-02 09:00:00
-
结果:会触发
dateTimeChanged
信号(但不会触发dateChanged
或timeChanged
,因为单独的日期或时间信号只在另一部分不变时才触发)。
-
-
2.3.示例1——实现日期计算器
我们创建一个新项目
注意上面那个是new,下面那个是old.
它们的objectname是
接下来我们来给这个按钮配置一个槽函数
编写计算按钮的 slot 函数
- 使用 daysTo函数可以计算两个日期的天数
- 使用secsTo函数可以计算两个时间的秒数
- 通过(秒数/3600)换算成小时数,再余上 24 得到零几个小时
- 使用 QString::number 把整数转成 QString 进行拼接
我们运行一下
怎么样?还行吗?
三.Dial
使⽤ QDial 表⽰⼀个旋钮.
有 些程序,通过⿏标拖动旋钮旋转,即可完成⼀些相关的设置.
3.1.核心属性
核心属性(决定旋钮的“值”和“范围”)
1. value (当前值)
-
说明:这是旋钮真正持有的数值,是程序内部用来进行设置或计算的核心数据。比如,当旋钮控制音量时,
value
就代表当前的音量大小(例如 50)。 -
类比:收音机旋钮当前指向的频率(例如 98.5 MHz)。
-
要点:这是你编程时最需要关心和读取的属性。
2. minimum (最小值) & maximum (最大值)
-
说明:它们共同定义了旋钮可以表示的数值范围。
value
只能在这个闭区间[minimum, maximum]
内变化。 -
类比:收音机旋钮上刻度的起点和终点(例如 87.5 MHz 到 108.0 MHz)。
-
要点:设置合适的范围非常重要。比如控制亮度,可以设为 0 到 100。
3. sliderPosition (滑块位置)
-
说明:这是旋钮在用户界面上当前显示的位置所对应的数值。在绝大多数情况下,
sliderPosition
和value
是同步的。但当tracking
属性为false
时,它们会暂时不同。 -
与
value
的区别:-
用户拖动旋钮时:手指不松开,旋钮在转动。
-
如果
tracking=True
(默认):sliderPosition
和value
会实时一起变化。你一边拖,程序里的值就一边变。 -
如果
tracking=False
:你拖动时,只有sliderPosition
在变(你能看到旋钮在动),但真正的value
保持不变。直到你松开鼠标的那一刻,sliderPosition
的值才会赋给value
。
-
-
类比:调整一个高级相机参数。
tracking=False
就像“预览模式”,你转动旋钮时只在取景器里看效果,但并未真正改变设置;觉得满意后松开手,才正式应用这个设置。 -
用途:用于需要避免频繁、实时更新的场景,比如调整一个复杂的滤镜,实时更新会导致卡顿,这时可以等用户确认位置后再更新。
调整步长属性(控制数值变化的“粒度”)
4. singleStep (单步步长)
-
说明:当用户使用键盘上的方向键(↑、↓、←、→) 来微调旋钮时,数值每次改变的大小。
-
类比:轻轻拨动旋钮时,它每次“咔哒”一下移动的最小格数。
-
例子:
singleStep
设为 1,按一下上箭头,value
增加 1。
5. pageStep (页面步长)
-
说明:当用户使用键盘上的 PageUp / PageDown 键来快速调整旋钮时,数值每次改变的大小。这个步长通常比
singleStep
大。 -
类比:用力拨动一下旋钮,让它跳过一个较大的区间。
-
例子:
minimum=0
,maximum=100
,pageStep=10
。当value=50
时按下 PageUp 键,value
会变成 60。
外观与行为属性
6. wrapping (是否允许循环)
-
说明:这个属性决定了旋钮的调整能否“套圈”。
-
wrapping=False
(默认):不允许循环。当value
达到maximum
时,再向右转就没反应了;达到minimum
时,再向左转也没反应。 -
wrapping=True
:允许循环。当value
达到maximum
时,再向右转一下,value
会立刻跳回到minimum
;反之亦然。 -
类比:
-
False
:像一个控制温度的旋钮,从“低温”转到“高温”就到头了。 -
True
:像一个控制角度的旋钮(0° ~ 360°),转到 360° 后自然就回到了 0°。
-
7. notchesVisible (是否显示刻度线)
-
说明:一个简单的布尔值。如果为
True
,旋钮的周围会显示一圈刻度线,让用户对当前数值的位置有更直观的感知,看起来也更专业。 -
类比:收音机旋钮底座上印着的频率刻度线。
8. notchTarget (刻度线密度)
-
说明:这个数字决定了刻度线之间的像素距离。数字越大,刻度线之间的间隔就越大,看起来就越“稀疏”。
-
工作原理:QDial 会尽量让刻度线之间的间隔接近
notchTarget
个像素。因为旋钮的周长是固定的,为了保持这个间隔,总的刻度线数量就会自动调整。-
notchTarget
值小 -> 间隔小 -> 刻度线数量多 -> 刻度密。 -
notchTarget
值大 -> 间隔大 -> 刻度线数量少 -> 刻度疏。
-
-
例子:默认值通常是 3.0 像素。如果你觉得刻度太密,可以把它设为 10.0,刻度线就会明显变少。
3.2.核心信号
1.valueChanged(int)
属性: 数值改变时触发。
详细讲解:
-
触发时机:这是最常用、最直接的信号。每当控件的当前值(value) 发生任何改变时,它就会立即被发射(emit)。
-
参数含义:它带有一个整数参数
int
,这个参数就是改变后的新值。 -
触发原因多样性:这个信号的触发原因非常多,只要是值变了就会触发,例如:
-
用户交互:用户用鼠标拖动滑块、点击滑块的轨道、使用键盘方向键调整。
-
程序设置:在你的代码里,你通过
setValue(50)
这样的函数强行改变了控件的值。 -
间接影响:如果范围变化(比如最大值
maximum
变小)导致当前值自动被调整(比如当前值70,最大值被设为50,那么当前值会自动变成50),这个过程也会触发一次valueChanged(50)
。
-
核心要点与类比:
你可以把它理解为 “当前读数”的变化通知。就像一个实时更新的仪表盘,指针每动一下,它就告诉你:“嘿,现在的数值是这个了!”
示例(音量滑块):
-
滑块范围是 0(静音)到 100(最大音量)。
-
当前音量为 30。
-
你:将滑块从 30 拖到 45。
-
信号发射:在这个过程中,滑块的值会连续变化(31, 32, 33, ...),
valueChanged
信号可能会连续发射很多次,每次都带着最新的值(比如valueChanged(45)
)。 -
你的程序:你把这个信号连接(connect)到一个函数上,比如
updateVolumeDisplay(int volume)
。这样,每次信号发射,这个函数就会被调用,界面上的音量数字显示就会实时更新为 45。
主要用途:用于对数值的每一次变化做出即时响应,比如实时更新显示、实时应用设置(调节音量、亮度等)。
2. rangeChanged(int, int)
属性: 范围变化时触发。
详细讲解:
-
触发时机:当控件的数值范围,即最小值(minimum) 或最大值(maximum) 被改变时触发。
-
参数含义:它带有两个整数参数
int min, int max
。这两个参数分别代表改变后的新范围,即新的最小值和新的最大值。 -
触发原因:这个信号的触发原因相对单一,主要是:
-
程序设置:你在代码中调用了
setRange(0, 200)
或setMinimum(10)
或setMaximum(500)
这样的函数,改变了最小或最大值。
-
核心要点与类比:
你可以把它理解为 “量程”的变化通知。就像万用表,从测量毫安电流切换到测量千伏电压时,它的量程发生了变化。这个信号就是在告诉你:“注意!我现在测量的范围变了!”
示例(音量滑块):
-
默认情况下,滑块范围是 0 到 100。
-
你的程序有一个“增强音量”的复选框,勾选后,音量上限要提高到 150。
-
你:勾选了“增强音量”复选框。
-
程序代码:执行
slider->setMaximum(150);
。 -
信号发射:
rangeChanged
信号被发射,参数为新的最小值(0)和新的最大值(150),即rangeChanged(0, 150)
。 -
注意:此时滑块的值(比如原来是 80)可能没有变,但因为它现在处于一个更大的范围(0-150)里,它在滑块轨道上的相对位置会改变(会向左移动一些,因为80/150和80/100的位置不同)。
主要用途:用于当控件的有效输入范围发生变化时需要做的调整。
-
更新标签:比如,在滑块的两端显示新的最小值和最大值。
-
重新校准:如果界面上有其他元素依赖于这个范围(比如根据范围计算一个百分比),那么收到这个信号后就需要重新计算。
-
数据验证:在改变范围后,检查当前值是否仍然在新范围内,并进行调整(不过很多控件会自动处理这个)。
3.3.代码示例一——调整窗口透明度
我们创建一个新项目
1) 在界⾯上创建⼀个旋钮和⼀个label
注意它们的objectname是
接下来我们编写widget.cpp,对旋钮初始化
现在我们来给这个旋钮来配置槽函数,
这里用到了它的专属信号
valueChanged(int)
属性: 数值改变时触发。
详细讲解:
-
触发时机:这是最常用、最直接的信号。每当控件的当前值(value) 发生任何改变时,它就会立即被发射(emit)。
-
参数含义:它带有一个整数参数
int
,这个参数就是改变后的新值。
我们运行一下
我们旋转一下旋钮
很完美吧!!
四.Slider
使⽤ QSlider 表⽰⼀个滑动条.
QS lider 和 QDial 都是继承⾃ QAbstractSlider ,因此⽤法上基本相同.
4.1.核心属性
1. value(当前值)
-
说明:这是滑动条当前所代表的数值。它是滑动条最核心的属性,当你拖动滑块时,这个值会随之改变。它被限制在
minimum
(最小值)和maximum
(最大值)之间。 -
类比:就像一个音量调节器,你把它拖到“50”的位置,那么
value
就是 50。
2. minimum(最小值)
-
说明:定义滑动条可以表示的最小数值。滑块移动到最左端(水平)或最下端(垂直)时对应的值。
-
默认值:通常是 0。
-
示例:如果你将
minimum
设为 10,那么滑块即使移动到起点,value
也至少是 10。
3. maximum(最大值)
-
说明:定义滑动条可以表示的最大数值。滑块移动到最右端(水平)或最上端(垂直)时对应的值。
-
默认值:通常是 99 或 100。
-
示例:如果你将
minimum
设为 0,maximum
设为 200,那么滑动条的值范围就是 0 到 200。
4. singleStep(单步长)
-
说明:当用户使用键盘上的方向键(←、→、↑、↓)来移动滑块时,或者用鼠标点击滑动条轨道两侧时,
value
每次增加或减少的数值。 -
用途:用于进行精确的微调。
-
示例:如果
singleStep
是 1,按一次右方向键,value
就增加 1。
5. pageStep(页步长)
-
说明:当用户使用键盘上的 PageUp 和 PageDown 键来移动滑块时,
value
每次增加或减少的数值。这个步长通常比singleStep
大得多。 -
用途:用于进行快速的、大幅度的调整。
-
示例:如果
pageStep
是 10,按一次 PageUp 键,value
就增加 10,相当于快速跳转一大步。
6. sliderPosition(滑块位置)
-
说明:这个属性指的是滑块在轨道上当前视觉上显示的位置。在绝大多数情况下,
sliderPosition
和value
是同步的,即滑块显示在哪,值就是多少。 -
与
value
的区别:这个区别主要在tracking
属性为false
时才显现出来(见下一条)。
7. tracking(跟踪)
-
说明:这个属性控制滑块移动时,
value
属性是否实时跟随sliderPosition
变化。-
true
(默认值):实时跟踪。你拖动滑块的过程中,每移动一个像素,value
都会立刻改变并发出信号。用户体验是流畅的、实时的。 -
false
:不实时跟踪。在你拖动滑块的过程中,只有当你释放鼠标按钮结束拖动时,value
才会一次性更新为最终的sliderPosition
值。在拖动过程中,只有sliderPosition
在变,value
保持不变。
-
-
用途:对于某些非常耗资源的操作(例如,实时调整一个高分辨率图片的滤镜),设置为
false
可以避免在拖动过程中进行大量不必要的计算,只在用户确认位置后才执行操作。
8. orientation(方向)
-
说明:设置滑动条的方向。
-
Qt.Horizontal
:水平滑动条。 -
Qt.Vertical
:垂直滑动条。
-
9. invertedAppearance(反转外观)
-
说明:这个属性控制滑动条的数值增长方向是否与常规方向相反。
-
false
(默认):对于水平滑动条,最小值在左,最大值在右。对于垂直滑动条,最小值在下,最大值在上。 -
true
:反转显示。对于水平滑动条,最小值在右,最大值在左。对于垂直滑动条,最小值在上,最大值在下。
-
-
示例:像一个反向的音量条,左边是最大声,右边是最小声。
10. tickPosition(刻度位置)
-
说明:控制是否在滑动条周围显示刻度标记,以及显示在什么位置。
-
QSlider.NoTicks
:不显示任何刻度。 -
QSlider.TicksAbove
(水平) /QSlider.TicksLeft
(垂直):刻度显示在轨道的上方(水平)或左方(垂直)。 -
QSlider.TicksBelow
(水平) /QSlider.TicksRight
(垂直):刻度显示在轨道的下方(水平)或右方(垂直)。 -
QSlider.TicksBothSides
:在轨道的两侧都显示刻度。
-
11. tickInterval(刻度间隔)
-
说明:控制刻度标记的密集程度。它指定每隔多少个数值单位绘制一个主刻度。
-
示例:如果
minimum
是 0,maximum
是 100,将tickInterval
设置为 20,那么滑动条上就会在 0, 20, 40, 60, 80, 100 的位置显示刻度。 -
特殊情况:如果
tickInterval
设置为 0,系统会根据pageStep
的大小自动计算一个合理的刻度间隔。
4.2.核心信号
1. valueChanged(int)
核心描述:
这是 QSlider 最常用、最重要的信号。当滑块的当前数值发生改变时,它就会被触发。
详细说明:
-
触发时机:任何时候,只要滑块代表的值(
value
属性)发生了变化,这个信号就会立即发出。这包括但不限于以下用户交互方式:-
用户用鼠标拖动滑块。
-
用户点击滑块轨道(滑槽)的空白处,使滑块跳跃式移动。
-
用户使用键盘的方向键(如 ←、→、PgUp、PgDn)来微调滑块位置。
-
通过代码调用
setValue()
方法改变滑块的值。
-
-
参数含义:信号带有一个
int
类型的参数,这个参数就是滑块改变后的新的当前值。你的槽函数可以接收这个参数,并立即根据新值执行相应的操作。 -
典型应用场景:
-
实时更新:实现“所见即所得”的效果。例如:
-
在音量控制中,用户拖动滑块时,音量随之实时改变。
-
在颜色选择器中,拖动代表红、绿、蓝的三个滑块,颜色预览区实时更新。
-
在视频播放器中,拖动进度条(一种特殊的 QSlider)时,实时显示对应的时间点。
-
-
-
注意事项:
-
如果你通过代码
setValue()
将一个值设置为与当前值相同,不会触发此信号。 -
有一个重载信号
valueChanged(double)
,当你设置滑块为浮点数范围时可能会用到,但最常用的还是整数版本的(int)
。
-
2. rangeChanged(int, int)
核心描述:
这个信号在滑块的数值范围(最小值和最大值)被改变时触发。
详细说明:
-
触发时机:当通过代码调用
setMinimum()
、setMaximum()
或setRange()
方法,并且实际改变了滑块的最小值或最大值时,这个信号就会被触发。 -
参数含义:信号带有两个
int
类型的参数。-
第一个参数
int
:改变后的最小值(minimum
)。 -
第二个参数
int
:改变后的最大值(maximum
)。
-
-
典型应用场景:
-
动态范围调整:当应用程序的逻辑需要改变滑块的可选范围时。例如:
-
在一个音频编辑软件中,当你放大时间轴视图时,进度条滑块的最大值(总时长)可能保持不变,但当前可视区域对应的滑块范围会动态变化,这时就需要重置滑块的范围。
-
在一个根据不同设备调整参数的界面中,选择“设备A”时,某个参数的范围是 0-100;选择“设备B”时,该参数的范围可能变为 20-80。切换设备后就需要更新滑块的范围,并触发此信号。
-
-
-
注意事项:
-
用户交互不会触发此信号。用户只能改变滑块的值(
value
),而不能改变滑块的范围(range
)。范围的改变必须由程序逻辑控制。 -
这个信号的使用频率远低于
valueChanged
。大多数情况下,滑块的范围在初始化时设定后就不再改变。
-
4.3.示例1——调整窗口大小
完美创建一个新项目
1) 在界⾯上创建两个滑动条,分别是⽔平和垂直滑动条
2) 编写代码初始化滑动条
3) 编写滑动条的 valueChanged slot函数
注意:这里遇到了一个信号我们需要了解一下
valueChanged(int)
核心描述:
这是 QSlider 最常用、最重要的信号。当滑块的当前数值发生改变时,它就会被触发。
详细说明:
-
触发时机:任何时候,只要滑块代表的值(
value
属性)发生了变化,这个信号就会立即发出。这包括但不限于以下用户交互方式:-
用户用鼠标拖动滑块。
-
用户点击滑块轨道(滑槽)的空白处,使滑块跳跃式移动。
-
用户使用键盘的方向键(如 ←、→、PgUp、PgDn)来微调滑块位置。
-
通过代码调用
setValue()
方法改变滑块的值。
-
-
参数含义:信号带有一个
int
类型的参数,这个参数就是滑块改变后的新的当前值。你的槽函数可以接收这个参数,并立即根据新值执行相应的操作。
好了,我们现在运行一下程序
可以看到调整滑动条,窗⼝⼤⼩就会随之改变.
变化很大了。
4.4.示例2——通过⾃定义快捷键调整滑动条位置
默认情况下滑动条可以通过⽅向键或者pageUp/pageDown调整⼤⼩,那么我们可以设置更多快捷键更好。
比如说设置-为减⼩value,设置=为增加value.
对应键盘的下面这两个
我们创建一下这个新项目
1) 在界⾯上创建滑动条和label
接下来我们就编写我们的代码, 创建 valueChanged 的slot函数
我们可以运行一下看看
拖动一下
很好!!!
但是这还不够,我们还没有设置我们的快捷键
在Qt中,通过 QShortcut
类可以设置键盘快捷键,其主要工作机制如下:
-
目的:为特定操作绑定一个键盘快捷键。
-
信号:当快捷键被触发时,会发出
QShortcut::activated
信号,以便执行后续逻辑。
QShortcut::activated 信号的触发时机
简单直接的回答:当用户按下为该 QShortcut
对象设置的精确按键组合,并且该快捷键当前处于有效状态时,信号就会被触发。
下面我们分解这个触发条件的两个核心要素:
1. 硬件条件:正确的按键操作
-
精确匹配按键序列:用户必须完全按下你为
QShortcut
设置的QKeySequence
。-
例如,设置为
Ctrl+S
:用户必须同时按住Ctrl
键和S
键。先按Ctrl
再按S
是标准操作,也算同时。 -
设置为
F5
:用户必须按下F5
功能键。 -
设置为
Ctrl+Shift+T
:用户必须同时按住Ctrl
、Shift
和T
三个键。
-
-
按下即触发:通常在按键按下的瞬间触发,而不是等待按键释放。
2. 软件条件:正确的上下文
这是最关键的部分,决定了在什么软件环境下按下按键才会有效。这由 QShortcut
的 上下文属性 决定。
-
Qt::WindowShortcut
(默认值)-
触发时机:只有当这个
QShortcut
的父对象(通常是某个QWidget
)所在的窗口是当前系统的活动窗口(Active Window)时,按下快捷键才会触发信号。 -
什么时候不触发:
-
你的程序窗口被最小化了。
-
用户切换到了另一个程序(例如浏览器、记事本),你的窗口失去了焦点。
-
同一个应用程序内有多个窗口,用户正在操作另一个子窗口,而当前快捷键属于那个非活动窗口。
-
-
这是最常用的模式,比如主窗口的保存、新建等操作。
-
-
Qt::ApplicationShortcut
-
触发时机:只要你的应用程序正在运行,无论哪个窗口是活动窗口,甚至没有窗口是活动的,按下快捷键都会触发信号。
-
应用场景:适用于全局性的、与应用整体相关的操作。
-
例子:音乐播放器的“播放/暂停”快捷键。即使用户正在用浏览器看网页,按下快捷键也能控制后台的音乐播放。
-
-
Qt::WidgetShortcut
-
触发时机:只有当这个
QShortcut
的父部件(Parent Widget)本身拥有键盘焦点(Focus)时,按下快捷键才会触发信号。 -
应用场景:特定于某个输入控件的操作。
-
例子:在一个
QTextEdit
控件上设置一个Ctrl+F
的快捷键用于搜索。只有当用户正在这个QTextEdit
里输入文字(即该控件有焦点)时,Ctrl+F
才会触发搜索。如果焦点切换到了旁边的按钮上,再按Ctrl+F
就不会触发。
-
好了,我们现在就来编写一下代码
整个项目完整的代码如下
我们运行一下
按一下=
再按一下-
可以看到此时按下-和=就可以调整value的值了.