当前位置: 首页 > news >正文

【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. 在用户输入过程中,每键入一个字符,显示文本就会变化一次

  2. 即使最终数值没有改变(比如用户输入了无效值又被自动修正),文本也可能经历变化

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=0maximum=100pageStep=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:用户必须同时按住 CtrlShift 和 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的值了.

http://www.dtcms.com/a/418135.html

相关文章:

  • activemq延迟消息变成实时收到了?
  • 重庆市住房和城乡建设部网站中山人才招聘网官网
  • 如何构建有效的需求知识库?如何让你的AI用它来评审新需求?
  • HTML 和 Streamlit ,到底哪个好
  • 数据结构 之 【图的遍历与最小生成树】(广度优先遍历算法、深度优先遍历算法、Kruskal算法、Prim算法实现)
  • 胶州做网站的做网站设计有哪些网页
  • 开源 C# 快速开发(十)通讯--http客户端
  • 如何用 ShedLock 让 Spring Boot 的定时任务在多实例环境下只执行一次
  • Mask R-CNN工业落地实战:计算机视觉物体检测开山鼻祖的产线级代码剖析
  • 沈阳网站制作全网性做橡胶的网站
  • C++压缩解压:Zstandard (Zstd)压缩库
  • 在网站建设中 为了防止工期拖延荥阳网站制作
  • Filebeat写ElasticSearch故障排查思路(下)
  • 禅道数据还原
  • 货架 网站建设 牛商网网站设计目的与规划怎么写
  • 基于STM32设计的环境监测系统(华为云IOT)_300
  • OPPO手机“绿线”问题争议,高价等于高端,何以分食iPhone市场?
  • 国产之光!金仓数据库KingbaseES Oracle兼容性深度体验大赏
  • wordpress付费插件网站垂直门户网站的盈利模式探讨
  • Navicat 技术指引 | KingbaseES 逆向工程与正向工程
  • C#:将Excel转换为HTML时将图像嵌入HTML中
  • 滨州医学院做计算机作业的网站电商网站 模板
  • 访问控制、用户认证、https
  • 大语言模型在金融风控中的应用
  • 深圳培训公司网站建设辽宁市营商环境建设局网站
  • Activity 管理工具类(兼容 Android 16+ / API 16)
  • 【2026计算机毕业设计】基于Springboot的Android校园周边美食汇系统
  • 网站换主推关键词会怎么样网站建设年度报告
  • 软装设计公司网站网站设计怎么做背景颜色
  • 陕西网站建设公司找哪家网站建设需要花多少钱