【Qt】输入类控件2——SpinBox,DateEdit,TimeEdit,Dial,Slider

目录

一.SpinBox

1.1.核心属性

1.2.核心信号

1.3.示例1------调整⻨当劳购物⻋中的份数.

[二.DateEdit &TimeEdit](#二.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() 信号。

  1. singleStep(单步步长)
  • 说明 :定义用户每次点击向上或向下按钮时,数值增加或减少的量。

  • 示例 :如果 singleStep 设为 10,当前值为 5,点击一次向上按钮,值将变为 15。

  • 用途:用于控制数值调整的粒度。

  1. displayIntegerBase(显示进制)
  • 说明 :控制数值在界面上的显示格式,即使用多少进制来呈现数字。

  • 示例

    • 设为 10:显示为我们日常使用的十进制(如 10, 11, 12)。

    • 设为 2:显示为二进制(如 1010, 1011, 1100)。

  • 重要提示 :这个属性只改变显示方式value 属性本身存储的仍然是十进制的数值。

  1. minimum(最小值)
  • 说明 :定义了 QSpinBox 所允许的数值下限

  • 行为 :用户无法通过任何操作(输入或点击)将 value 设置为比 minimum 更小的值。如果尝试通过程序设置一个小于 minimum 的值,value 会被自动修正为 minimum

  1. maximum(最大值)
  • 说明 :定义了 QSpinBox 所允许的数值上限

  • 行为 :与 minimum 相对,用户无法将 value 设置为比 maximum 更大的值。

  1. suffix(后缀)
  • 说明 :在显示的数值后面添加一个固定的文本字符串。

  • 示例 :如果 value 是 90,suffix 设为 "°",则 SpinBox 中会显示 90°。常用于表示单位(如度、厘米、元)。

  1. prefix(前缀)
  • 说明 :在显示的数值前面添加一个固定的文本字符串。

  • 示例 :如果 value 是 100,prefix 设为 "¥",则 SpinBox 中会显示 ¥100。常用于表示货币符号等。

  1. wrapping(循环)
  • 说明 :一个布尔值,控制当数值达到边界时是否循环

  • 行为

    • 设为 true(启用):当数值已经是 maximum 时,再点击向上按钮,数值会跳转到 minimum;反之,当数值是 minimum 时点击向下按钮,会跳转到 maximum

    • 设为 false(禁用,默认):当数值达到边界时,相应的按钮会变灰,无法再向该方向调整。

  1. frame(边框)
  • 说明 :一个布尔值,控制是否绘制 QSpinBox 外部的边框

  • 行为 :设为 true(默认)时,有一个明显的边框;设为 false 时,控件看起来是扁平、无边框的。

  1. alignment(对齐方式)
  • 说明 :控制 SpinBox 文本框内内容的对齐方式

  • 可选值 :如左对齐(Qt::AlignLeft)、居中对齐(Qt::AlignCenter)、右对齐(Qt::AlignRight)等。

  • 用途:通常设置为右对齐,符合数字输入的习惯。

  1. readOnly(只读)
  • 说明 :控制用户是否能够编辑 SpinBox 的内容。

  • 行为

    • 设为 true:用户不能通过键盘直接输入数值,只能通过上下按钮来调整。控件背景通常显示为灰色。

    • 设为 false(默认):用户既可以点击按钮也可以直接输入。

  1. buttonSymbols(按钮符号)
  • 说明 :定义上下按钮上显示的图标样式

  • 可选值

    • UpDownArrows(上下箭头):按钮上显示三角形箭头(默认)。

    • PlusMinus (加减号):按钮上显示 +- 符号。

    • NoButtons(无按钮):完全不显示调整按钮,用户只能通过键盘输入或编程方式改变值。

  1. accelerated(加速)
  • 说明 :一个布尔值,控制当用户长时间按住 调整按钮时,数值的变化速度是否会加速

  • 行为

    • 设为 true(启用):按住按钮不放,数值会先按 singleStep 正常变化,一段时间后变化速度会显著加快,便于快速调整大范围的数值。

    • 设为 false(禁用):无论按住多久,数值都始终以 singleStep 的恒定速度变化。

  1. correctionMode(修正模式)
  • 说明 :定义当用户输入了一个无效值(如超出范围)后,控件如何自动修正。

  • 可选值

    • CorrectToPreviousValue (修正为上一个值):如果输入无效,SpinBox 会自动恢复到此输入之前的那个有效值。

    • CorrectToNearestValue (修正为最接近的值):如果输入无效,SpinBox 会将其自动修正为最接近的有效值 (通常是 minimummaximum)。

  1. 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

  1. 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秒,那么控件就会显示出这个完整的信息。

  • 关系datetime 属性本质上是从 dateTime 中拆分出来的部分。当你修改 dateTime 时,datetime 也会自动更新。

  1. date(日期)

这个属性只关注 dateTime 中的 日期部分(年、月、日),而忽略时间部分。

  • 功能:专门用于获取或设置控件中的日期。当你只关心"哪一天"而不关心具体时间点时,使用这个属性非常方便。

  • 示例 :如果 dateTime2001年1月1日下午2点30分,那么 date 属性就是 2001年1月1日

  • 操作影响 :如果你只修改了 date(例如从1月1日改成1月2日),那么时间部分(下午2点30分)会保持不变,整个 dateTime 会更新为 2001年1月2日下午2点30分

  1. time(时间)

date 属性相反,这个属性只关注 dateTime 中的 时间部分(时、分、秒),而忽略日期部分。

  • 功能:专门用于获取或设置控件中的时间。当你只关心"几点几分"而不关心具体日期时,就使用这个属性。

  • 示例 :如果 dateTime2001年1月1日凌晨0点0分0秒,那么 time 属性就是 0点0分0秒

  • 操作影响 :如果你只修改了 time(例如从0点0分改成10点30分),那么日期部分(2001年1月1日)会保持不变,整个 dateTime 会更新为 2001年1月1日上午10点30分

  1. 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这非常重要:不同的库或语言对格式符号的定义可能不同,使用时务必查阅当前环境的文档。

  1. minimumDateTime(最小日期时间) 和 maximumDateTime(最大日期时间)

这两个属性共同定义了用户可以选择的一个 有效范围

  • 功能:限制用户输入或选择的日期时间不能超出设定的最小值和最大值。

  • minimumDateTime(最小):用户不能选择比这个值更早的日期时间。

  • maximumDateTime(最大):用户不能选择比这个值更晚的日期时间。

  • 应用场景:例如,在设置会议时间时,可以限制不能选择今天之前的时间;在设置生日时,可以限制不能选择今天之后的日期。这提供了数据有效性的基本保障。

  1. 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 信号。

  1. 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 信号。

  1. 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 信号(但不会 触发 dateChangedtimeChanged,因为单独的日期或时间信号只在另一部分不变时才触发)。

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)。

  • 要点:这是你编程时最需要关心和读取的属性。

  1. minimum (最小值) & maximum (最大值)
  • 说明 :它们共同定义了旋钮可以表示的数值范围value 只能在这个闭区间 [minimum, maximum] 内变化。

  • 类比:收音机旋钮上刻度的起点和终点(例如 87.5 MHz 到 108.0 MHz)。

  • 要点:设置合适的范围非常重要。比如控制亮度,可以设为 0 到 100。

  1. sliderPosition (滑块位置)
  • 说明 :这是旋钮在用户界面上当前显示的位置 所对应的数值。在绝大多数情况下,sliderPositionvalue同步 的。但当 tracking 属性为 false 时,它们会暂时不同。

  • value 的区别

    • 用户拖动旋钮时:手指不松开,旋钮在转动。

    • 如果 tracking=True(默认):sliderPositionvalue 会实时一起变化。你一边拖,程序里的值就一边变。

    • 如果 tracking=False:你拖动时,只有 sliderPosition 在变(你能看到旋钮在动),但真正的 value 保持不变。直到你松开鼠标 的那一刻,sliderPosition 的值才会赋给 value

  • 类比 :调整一个高级相机参数。tracking=False 就像"预览模式",你转动旋钮时只在取景器里看效果,但并未真正改变设置;觉得满意后松开手,才正式应用这个设置。

  • 用途:用于需要避免频繁、实时更新的场景,比如调整一个复杂的滤镜,实时更新会导致卡顿,这时可以等用户确认位置后再更新。


调整步长属性(控制数值变化的"粒度")

  1. singleStep (单步步长)
  • 说明 :当用户使用键盘上的方向键(↑、↓、←、→) 来微调旋钮时,数值每次改变的大小。

  • 类比:轻轻拨动旋钮时,它每次"咔哒"一下移动的最小格数。

  • 例子singleStep 设为 1,按一下上箭头,value 增加 1。

  1. pageStep (页面步长)
  • 说明 :当用户使用键盘上的 PageUp / PageDown 键来快速调整旋钮时,数值每次改变的大小。这个步长通常比 singleStep 大。

  • 类比:用力拨动一下旋钮,让它跳过一个较大的区间。

  • 例子minimum=0, maximum=100, pageStep=10。当 value=50 时按下 PageUp 键,value 会变成 60。


外观与行为属性

  1. wrapping (是否允许循环)
  • 说明:这个属性决定了旋钮的调整能否"套圈"。

  • wrapping=False(默认):不允许循环。当 value 达到 maximum 时,再向右转就没反应了;达到 minimum 时,再向左转也没反应。

  • wrapping=True:允许循环。当 value 达到 maximum 时,再向右转一下,value 会立刻跳回到 minimum;反之亦然。

  • 类比

    • False:像一个控制温度的旋钮,从"低温"转到"高温"就到头了。

    • True:像一个控制角度的旋钮(0° ~ 360°),转到 360° 后自然就回到了 0°。

  1. notchesVisible (是否显示刻度线)
  • 说明 :一个简单的布尔值。如果为 True,旋钮的周围会显示一圈刻度线,让用户对当前数值的位置有更直观的感知,看起来也更专业。

  • 类比:收音机旋钮底座上印着的频率刻度线。

  1. 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。

主要用途 :用于对数值的每一次变化做出即时响应,比如实时更新显示、实时应用设置(调节音量、亮度等)。


  1. 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(页步长)

  • 说明 :当用户使用键盘上的 PageUpPageDown 键来移动滑块时,value 每次增加或减少的数值。这个步长通常比 singleStep 大得多。

  • 用途 :用于进行快速的、大幅度的调整

  • 示例 :如果 pageStep 是 10,按一次 PageUp 键,value 就增加 10,相当于快速跳转一大步。

6. sliderPosition(滑块位置)

  • 说明 :这个属性指的是滑块在轨道上当前视觉上显示的位置 。在绝大多数情况下,sliderPositionvalue 是同步的,即滑块显示在哪,值就是多少。

  • 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)


  1. rangeChanged(int, int)

核心描述:

这个信号在滑块的数值范围(最小值和最大值)被改变时触发。

详细说明:

  • 触发时机 :当通过代码调用 setMinimum()setMaximum()setRange() 方法,并且实际改变了滑块的最小值或最大值时,这个信号就会被触发。

  • 参数含义 :信号带有两个 int 类型的参数。

    • 第一个参数 int:改变后的最小值minimum)。

    • 第二个参数 int:改变后的最大值maximum)。

  • 典型应用场景

    • 动态范围调整:当应用程序的逻辑需要改变滑块的可选范围时。例如:

      • 在一个音频编辑软件中,当你放大时间轴视图时,进度条滑块的最大值(总时长)可能保持不变,但当前可视区域对应的滑块范围会动态变化,这时就需要重置滑块的范围。

      • 在一个根据不同设备调整参数的界面中,选择"设备A"时,某个参数的范围是 0-100;选择"设备B"时,该参数的范围可能变为 20-80。切换设备后就需要更新滑块的范围,并触发此信号。

  • 注意事项

    • 用户交互不会触发此信号 。用户只能改变滑块的值(value),而不能改变滑块的范围(range)。范围的改变必须由程序逻辑控制。

    • 这个信号的使用频率远低于 valueChanged。大多数情况下,滑块的范围在初始化时设定后就不再改变。

4.3.示例1------调整窗口大小

完美创建一个新项目

  1. 在界⾯上创建两个滑动条,分别是⽔平和垂直滑动条
  1. 编写代码初始化滑动条
  1. 编写滑动条的 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:用户必须同时按住 CtrlShiftT 三个键。

  • 按下即触发 :通常在按键按下的瞬间触发,而不是等待按键释放。

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的值了.

相关推荐
用户805533698031 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner1 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz6 天前
QML Hello World 入门示例
qt
xcyxiner9 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner10 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner10 天前
DicomViewer (添加模型类)3
qt
xcyxiner11 天前
DicomViewer (目录调整) 2
qt
xcyxiner11 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00613 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术13 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript