『Qt』输入类控件 (二)

1 QDial
QDial控件是Qt中提供的一种旋钮控件, 通过旋钮来控制某些数值的增减;

通常通过鼠标来控制旋钮的旋转以此控制数值的变化;
1.1 核心属性
| 属性 | 说明 |
|---|---|
value |
持有的数值 |
minimum |
最小值 |
maximum |
最大值 |
singleStep |
按下方向键的时候改变的步长 |
pageStep |
按下pageUp/pageDown的时候改变的步长 |
sliderPosition |
界面上的旋钮初始位置 |
tracking |
外观是否跟踪数值变化默认为true. 一般不需要修改 |
wrapping |
是否允许循环调整即数值如果超过最大值, 是否允许回到最小值(调整过程能否循环) |
notchesVisible |
是否显示刻度线 |
notchTarget |
刻度线之间的相对位置数字越大, 刻度线越稀疏 |
1.2 核心信号
| 信号 | 说明 |
|---|---|
valueChanged(int) |
数值改变时触发 |
rangeChanged(int, int) |
范围改变时触发(通常用户无法通过手动操作来修改QDial的范围因此当代码触发范围变化(如minimum或maximum发生变化则为范围发生变化)) |
1.3 代码示例 - 创建 QDial 控制 Widget 透明度
创建一个QDial, 通过QDial来实现对Widget的控制, 并将当前值显示在Label中;
-
所需控件
QDialLabel

-
初始化控件
在实际设计之前需要对控件进行初始化, 如
QLabel的初始化显示与QDial的最小值, 最大值, 刻度线等内容;Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); ui->dial->setMaximum(50); ui->dial->setMinimum(0); ui->dial->setNotchesVisible(true); ui->label->setText("当前透明度为: "+QString::number(ui->dial->value())); } -
设计槽函数
QLabel为用于显示的控件, 因此不对其信号进行处理, 重点处理QDial控件的ValueChanged(int)信号;对应的槽重点修改
windowOpacity透明度的内容, 其中ValueChanged(int)中所给的int为当前控件的所在位置的值;void Widget::on_dial_valueChanged(int value) { this->setWindowOpacity(((double)100-value)/100); ui->label->setText("当前透明度为: "+QString::number(ui->dial->value())); }我们重点设置的是透明度, 而不是不透明度, 为了避免透明度过高而找不到窗口, 这里我们选择使用
50为最终值; -
运行结果

2 QSlider
QSlider控件是Qt提供的一种滑动条控件;
旨在能够设计一个滑动条来改变某些控件的参数或是其他控制;

可以看到, 实际上在侧边栏中QSlider存在两种, 分别为横向与纵向;
实际上其可以通过对应的属性来修改横向或是纵向;

其中Horizontal为横向, Vertical为纵向;
其使用方法与QDial类似;
2.1 核心属性
| 属性 | 说明 |
|---|---|
value |
持有的数值 |
minimum |
最小的数值 |
maximum |
最大的数值 |
singleStep |
按下方向键时改变的步长 |
pageStep |
按下pageUp/pageDown时的步长 |
sliderPosition |
滑动条显示的初始位置 |
tracking |
外观是否会跟踪数值变化默认值为true, 一般不需要修改 |
orientation |
滑动条的方向是水平还是垂直Horizontal为横向, Vertical为纵向 |
invertedAppearance |
是否要反转滚动条的方向 |
tickPosition |
刻度的位置 |
tickInterval |
刻度的密集程度 |
2.2 核心信号
| 信号 | 说明 |
|---|---|
valueChanged(int) |
数值改变时触发 |
rangeChanged(int, int) |
范围变化时触发 |
该控件的核心信号与QDial控件类似;
2.3 示例代码 - 创建 QSilder 控制 Widget 长宽
创建一个程序, 通过横向, 纵向QSilder分别控制Widget的长宽
-
所需控件
两个
QSilder控件, 分别为横向与纵向;
-
初始化控件
对所需控件进行初始化, 本质上是对两个
Slider的最大值/最小值以及当前值进行初始化;Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); ui->horizontalSlider->setMaximum(1500); ui->horizontalSlider->setMinimum(500); ui->horizontalSlider->setValue(this->geometry().width()); ui->horizontalSlider->setSingleStep(10); ui->verticalSlider->setInvertedAppearance(true); // 反转方向 ui->verticalSlider->setMaximum(800); ui->verticalSlider->setMinimum(500); ui->verticalSlider->setValue(this->geometry().height()); ui->verticalSlider->setSingleStep(10); } -
设置槽函数
对两个
Silder的valueChanged()信号进行处理;通过信号所给的值来设置
Widget的geometry的宽与高;void Widget::on_horizontalSlider_valueChanged(int value) { this->setGeometry(geometry().x(), geometry().y(), value, geometry().height()); } void Widget::on_verticalSlider_valueChanged(int value) { this->setGeometry(geometry().x(), geometry().y(), geometry().width(), value); } -
运行结果

2.3.1 为程序设置快捷键 - 通过快捷键控制 Slider 设置长宽
实际上针对Slider控件而言, 其可以通过方向键(up/down/left/right)来控制数值的增长, 但有两个问题:
- 在通过方向键来控制时焦点必须在该控件上
up与right永远为增,down与left永远为降
而在Qt中可以通过ShortCut类设置快捷键来绑定对应的控件;
此处我们将快捷键设置为h/j/k/l, 其中k为纵向Slider的缩小, j为纵向Slider的增大, h则为横向的缩小, l为横向的增大;
此次每次步长设置为15, 且再添加一个QLabel来显示对应的按键;

-
设置快捷键对象并绑定快捷键
快捷键对象通常在使用
QShortcut类来定制;QShortcut *shortcutH = new QShortcut(this); QShortcut *shortcutJ = new QShortcut(this); QShortcut *shortcutK = new QShortcut(this); QShortcut *shortcutL = new QShortcut(this); shortcutH->setKey(QKeySequence("h")); shortcutJ->setKey(QKeySequence("j")); shortcutK->setKey(QKeySequence("k")); shortcutL->setKey(QKeySequence("l"));通过
setKey方法并传入QKeySequence对象来绑定对应的快捷键; -
设置槽函数
当对应快捷键被按下时, 将会发出一个
QShortcut::activated()信号;需要对应的槽函数来处理对应的信号, 而槽内则是直接对
Slider控件的value进行修改;当
Slider控件的value发生改变时又会触发其ValueChanged()信号, 从而修改Widget的大小;void Widget::horizontalAdd(){ int value = ui->horizontalSlider->value(); ui->horizontalSlider->setValue(value+15); ui->label->setText("Key - L"); } void Widget::horizontalSub(){ int value = ui->horizontalSlider->value(); ui->horizontalSlider->setValue(value-15); ui->label->setText("Key - H"); } void Widget::verticalAdd(){ int value = ui->verticalSlider->value(); ui->verticalSlider->setValue(value+15); ui->label->setText("Key - J"); } void Widget::verticalSub(){ int value = ui->verticalSlider->value(); ui->verticalSlider->setValue(value-15); ui->label->setText("Key - K"); }同时需要注意的是, 我们设置了一个
QLabel控件来事实打印所按下的快捷键; -
connect绑定信号和槽并初始化QLabel通过
connect来绑定对应的信号和槽, 并初始化QLabel初始化显示为空;connect(shortcutH, &QShortcut::activated, this, &Widget::horizontalSub); connect(shortcutJ, &QShortcut::activated, this, &Widget::verticalAdd); connect(shortcutK, &QShortcut::activated, this, &Widget::verticalSub); connect(shortcutL, &QShortcut::activated, this, &Widget::horizontalAdd); ui->label->setText(""); -
运行结果
