QT6中Dial、Key Sequence Edit、LCD Number 功能及用法详解
一.QDial (刻度盘/旋钮)
1.功能与特点
QDial 提供了一个圆形范围的输入控件,类似于现实世界中的旋钮、刻度盘或电位器。它继承自 QAbstractSlider,因此具有滑块的核心功能(如范围、当前值、步长),但以旋转的方式进行交互。
数值输入:允许用户在一个圆形范围内通过旋转选择一个数值。
视觉反馈:可以显示刻度线 (setNotchesVisible),让用户对当前值有一个直观的感知。
可循环:可以设置为循环模式 (setWrapping),就像汽车速度表一样,旋转超过最大值后会回到最小值。
信号:主要发出 valueChanged(int) 信号,当值改变时触发。
2.应用场景
QDial 适用于那些需要模拟物理旋钮或进行粗略、快速调整的场景,其精确度要求通常低于直接的数字输入(如QSpinBox)。
媒体播放器 / 音频处理软件:
音量控制:调节主音量、声道平衡。
效果器参数:调整低音、高音、混响、延迟等效果的强度。旋钮是音频软件界面的标准控件。
工业控制 / 仪器仪表仿真:
模拟物理设备上的控制旋钮,如收音机调频、示波器参数调整、老式电台设备等。
控制机械臂的移动速度、角度等。
游戏设置:
调整游戏中的灵敏度、视野(FOV)、亮度、对比度等需要平滑过渡的参数。
图像/视频编辑软件:
调整图片的色相、饱和度、亮度、对比度等。
3.何时选择 QDial 而非 QSlider?
当界面设计需要节省垂直或水平空间时(圆形更紧凑)。
当需要强烈的视觉隐喻,暗示其功能类似于一个物理旋钮时。
当进行粗略、快速的调整比精确输入更重要时。
4.代码示例
创建 QDial 对象,并设置范围、初始值等属性:cite[1]
QDial *dial = new QDial(this);
dial->setFixedSize(100, 100); // 宽200,高200
dial->setRange(0, 100); // 设置范围
dial->setValue(50); // 设置初始值
dial->setNotchesVisible(true); // 显示刻度
// dial->setNotchTarget(3.7); // (可选)设置凹槽间的目标像素数,默认约为3.7
// dial->setWrapping(true); // (可选)启用循环,允许超过360度旋转
dial->setGeometry(50, 100, 100, 20);
// 创建一个标签用于显示当前值
QLabel *valueLabel = new QLabel("当前值: 50", this);
valueLabel->setAlignment(Qt::AlignLeft);
valueLabel->setGeometry(70, 203, 100, 20);
// 连接信号槽:当刻度盘值改变时更新标签显示
QObject::connect(dial, &QDial::valueChanged, [=](int value) {
valueLabel->setText(QString("当前值: %1").arg(value));
// 可根据需要在此添加其他值变化后的操作
});
二.QKeySequenceEdit (键序列编辑框)
1.功能与特点
QKeySequenceEdit 是一个专门用于输入和捕获键盘快捷键的控件。用户只需在控件获得焦点时按下所需的按键组合,控件就会自动将其记录并显示为标准的快捷键格式(如 "Ctrl+S")。
快捷键捕获:自动捕获按键组合,无需用户手动输入 "Ctrl+Shift+P" 这样的文本。
验证与格式化:自动验证输入的有效性,并将按键组合格式化为本地化的标准字符串(如 macOS 上显示 "?S")。
获取键序列:通过 keySequence() 方法获取输入的 QKeySequence 对象,可直接用于设置操作的快捷键。
信号:keySequenceChanged(const QKeySequence &) 当快捷键改变时发出。
2.应用场景
QKeySequenceEdit 的应用场景非常专一,几乎只用于一类功能:
软件的“偏好设置”或“选项”对话框:
自定义快捷键:允许用户为各种功能(如保存、复制、粘贴、运行命令)设置自己习惯的快捷键。
这是它最核心、最常见的用途。
游戏控制设置:
允许玩家自定义游戏中的操作按键,如移动、攻击、使用技能等。
需要动态配置热键的应用程序:
例如屏幕录制软件(设置开始/停止录制快捷键)、自动化脚本工具(设置触发脚本的热键)。
3.核心价值
它为用户提供了一种极其方便、不易出错的方式来设置快捷键,远比让用户在一个普通的文本框中手动输入键位组合要友好和可靠。
4.代码示例
创建一个标签,用于显示信息和快捷键
QLabel *infoLabel = new QLabel("请输入新的快捷键序列(如 Ctrl+S)", this);
infoLabel->setWordWrap(true); // 允许标签文本换行
infoLabel->setAlignment(Qt::AlignCenter);
infoLabel->setGeometry(250, 100, 200, 20);
// 创建 KeySequenceEdit 控件
QKeySequenceEdit *keySeqEdit = new QKeySequenceEdit(this);
// (可选)设置默认键序列,例如 Ctrl+S
// keySeqEdit->setKeySequence(QKeySequence(Qt::CTRL | Qt::Key_S));
keySeqEdit->setGeometry(250, 130, 100, 20);
// 创建一个标签,用于显示当前设置的快捷键
QLabel *currentShortcutLabel = new QLabel("当前快捷键: None", this);
currentShortcutLabel->setAlignment(Qt::AlignLeft);
currentShortcutLabel->setGeometry(250, 160, 200, 20);
// 连接信号槽:当键序列发生更改时发出的信号
QObject::connect(keySeqEdit, &QKeySequenceEdit::keySequenceChanged, [=](const QKeySequence &keySequence) {
if (!keySequence.isEmpty()) {
currentShortcutLabel->setText("当前快捷键: " + keySequence.toString(QKeySequence::NativeText));
// 此处通常会将此快捷键绑定到某个QAction的shortcut上
// 例如:anAction->setShortcut(keySequence);
} else {
currentShortcutLabel->setText("当前快捷键: None");
}
});
// (可选)连接编辑结束信号
// QObject::connect(keySeqEdit, &QKeySequenceEdit::editingFinished, [=]() { ... });
三.QLCDNumber (LCD数字显示)
1.功能与特点
QLCDNumber 控件模拟了液晶数码管(LCD)的显示效果,用于显示数字或少量字母。它提供了一种独特的、具有科技感的视觉风格。
数字显示:主要用于显示整数或浮点数。
显示模式:支持多种进制显示:十进制(Dec)、十六进制(Hex)、八进制(Oct)、二进制(Bin)。
外观样式:提供几种显示样式来模拟不同风格的LCD:
Outline: 轮廓线
Filled: 填充(默认)
Flat: 扁平
位数控制:可以通过 setDigitCount() 预设显示的数字位数。不足位时会前补零,超过位数时会触发 overflow() 信号或显示错误。
小数字点:支持显示小数点。
2.应用场景
QLCDNumber 适用于需要突出显示数字、营造特定风格(复古、科技、工业) 或模拟数字设备的场景。
仪器仪表面板:
模拟数字电压表、万用表、频率计数器、汽车仪表盘等的显示。
计时器/秒表:
显示经过的时间、倒计时等。其高对比度的数字易于快速读取。
计算器:
作为计算器的结果显示屏,完美复现经典计算器的外观。
硬件监控程序:
显示CPU使用率、内存占用、网络速度、温度等实时变化的数值数据。
游戏界面:
显示分数、生命值、金币数量等,营造复古街机游戏的风格。
3.何时选择 QLCDNumber 而非 QLabel?
当你需要的不是普通的文本标签,而是一种具有特定风格的数字显示器时。
当你需要营造复古、科技感或工业风的界面外观时。
当你需要简单显示不同进制的数字时。
4.代码示例
创建 QLCDNumber 对象
QLCDNumber *lcdNumber = new QLCDNumber(this);
lcdNumber->setFixedSize(80, 40); // 宽,高
lcdNumber->setDigitCount(5); // 设置显示数字的位数
lcdNumber->setSegmentStyle(QLCDNumber::Flat); // 设置显示样式: Outline(轮廓), Filled(填充-默认), Flat(平面)
lcdNumber->display(0); // 初始显示为0
lcdNumber->setMode(QLCDNumber::Dec); // 十进制
//lcdNumber->setMode(QLCDNumber::Hex); // 十六进制
// lcdNumber->setMode(QLCDNumber::Oct); // 八进制
// lcdNumber->setMode(QLCDNumber::Bin); // 二进制
lcdNumber->setGeometry(250, 300, 150, 40);
// 创建一个滑块(QSlider)来控制LCD显示的数字
QSlider *slider = new QSlider(Qt::Horizontal, this);
slider->setRange(0, 1000); // 设置滑块范围
slider->setValue(0);
slider->setGeometry(250, 360, 150, 20);
// 连接信号槽:当滑块的值改变时,更新LCD显示的数字
QObject::connect(slider, &QSlider::valueChanged,
lcdNumber, static_cast<void (QLCDNumber::*)(int)>(&QLCDNumber::display));
// 连接信号槽:当滑块的值改变时,更新LCD显示的数字 //也可以
// connect(slider, SIGNAL(valueChanged(int)), lcdNumber, SLOT(display(int)));
四.代码界面