在 Qt Designer 的组件面板里有几个滑动型数值输 入组件,包括滑动条(QSlider 类)、卷滚条(QScrollBar 类)和表盘(QDial 类),对应的 3 个类具有同一个父类 QAbstractSlider,所以它们具有一些共有的 特性。例如 QSlider 和 QScrollBar 都有 orientation 属性, 可以设置为水平方向或垂直方向。
进度条(QProgressBar 类)是用于显示数值的组件, 特别适用于显示百分比进度。
一. 各组件类的主要属性和接口函数
1.QAbstractSlider 类的属性
QAbstractSlider 是 QSlider、QScrollBar 和 QDial 的父类,它定义了这几个类共有的一些属性和接口函数。
属性 | 属性值类型 | 功能 |
minimum | int | 数据范围的最小值,默认值是 0 |
maximum | int | 数据范围的最大值,默认值是 99 |
singleStep | int | 拖动滑动条上的滑块,或按下卷滚条两端的按钮时变化的最小数值,默认值是 1 |
pageStep | int | 输入焦点在组件上时,按下 PgUp 或 PgDn 键时变化的数值,默认值是 10 |
value | int | 组件的当前值,拖动滑块时自动改变此值 |
sliderPosition | int | 滑块的位置,若 tracking 属性值为 true,sliderPosition 值就等于 value 值 |
tracking | bool | 如果设置为 true,改变 value 值同时会改变 sliderPosition 值 |
orientation | Qt::Orientation | 滑动条或卷滚条的方向,可以设置为水平方向或垂直方向 |
invertedAppearance | bool | 显示方式是否反向,默认值为 false,水平的滑动条或卷滚条由左向右数值增大 |
invertedControls | bool | 反向按键控制,若设置为 true,则按下 PgUp 或 PgDn 键时调整数值的方向相反 |
QAbstractSlider 的接口函数主要是这些属性的读写函数,还有一个常用的函数 setRange()用于设置组件的最小值和最大值,函数原型定义如下:
void QAbstractSlider::setRange(int min, int max)
2.QAbstractSlider 类的信号
QAbstractSlider 定义了几个信号,信号函数定义如下,信号触发时机见注释。
void actionTriggered(int action) //滑动条触发一些动作时
void rangeChanged(int min, int max) //minimum 或 maximum 属性值发生变化时
void sliderMoved(int value) //用户按住鼠标拖动滑块时
void sliderPressed() //在滑块上按下鼠标时
void sliderReleased() //在滑块上释放鼠标时
void valueChanged(int value) //value 属性值变化时
actionTriggered(int action)信号在滑动条触发一些动作时被发射,action 表示动作的类型,用枚举类型 QAbstractSlider::SliderAction 的值表示,如 SliderToMinimum 表示滑动到最小值。
value 属性值改变时,组件会发射 valueChanged()信号,可以通过拖动滑块改变 value 属性的 值,也可以在程序中运行函数 setValue()改变 value 属性的值。
用鼠标拖动滑块移动时,组件会发射 sliderMoved(int value)信号,参数 value 是组件的当前值。 如果 tracking 属性设置为 true,在拖动滑块时组件还会发射 valueChanged()信号;如果 tracking 属 性设置为 false,则只有在拖动结束并释放鼠标时组件才发射 valueChanged()信号。
3.QSlider 类
QSlider 一般用作滑动输入数值数据的组件,QSlider 类新定义的属性有两个。
• tickPosition:标尺刻度的显示位置,属性值是枚举类型 QSlider::TickPosition。
• tickInterval:标尺刻度的间隔值,若设置为 0,会在 singleStep 和 pageStep 之间自动选择。
4.QScrollBar 类
QScrollBar 没有定义新的属性。QScrollBar 一般与文本编辑器或容器组件组合使用,以便在一个大的显示范围内移动,例如 QPlainTextEdit 组件显示的文本超过编辑框的大小后,就会自动出现 水平卷滚条或垂直卷滚条。
5.QDial 类
QDial 表示表盘式的组件,通过旋转表盘获得输入值,QAbstractSlider 定义的一些属性对 QDial 没有影响,例如 orientation 属性。QDial 定义了 3 个新的属性。
• notchesVisible:表盘外围的小刻度线是否可见。
• notchTarget:表盘刻度间的间隔像素值。
• wrapping:表盘上首尾刻度是否连贯。如果设置为 false,表盘的最小值和最大值刻度之间有一定的空间,否则,表盘刻度是一整圈连续的。默认值是 false。
6.QProgressBar 类
QProgressBar 表示进度条组件, 一般以百分比数据来显示进度。QProgressBar 的父类是 QWidget,它与 QAbstractSlider 类没有继承关系。QProgressBar 组件中几个不易理解的属性如下:
• textDirection:文字的方向,这表示垂直进度条的文字的阅读方向,包括从上往下和从下往上两种选项。这个属性对于水平进度条无意义。
• format:显示文字的格式,“%p%”显示百分比,“%v”显示当前值,“%m”显示总步数。 默认为“%p%”
QProgressBar 类的接口函数主要是属性的读写函数。QProgressBar 还有两个常用的与属性读写无关的函数,定义如下:
void QProgressBar::setRange(int minimum, int maximum) //设置范围
void QProgressBar::reset() //将进度条复位,也就是使进度值为 0
二. 示例程序功能实现
示例的窗口基类是 QWidget,效果如图:
“滑动输入”分组框里的 3 个滑动类组件作为输入组件,当它们的值变化时,会改变进度条的值。“ProgressBar 显示和设置”分组框中的几个复选框和单选按钮用于设置进度条的一些属性。
为了测试 QProgressBar 的 format 属性的显示效果,将进度条的 maximum 属性值设置为 200, 表盘、滑动条和卷滚条的 maximum 属性值也设置为 200。
需要为表盘、滑动条和卷滚条这 3 个组件的 valueChanged()信号关联槽函数,如果使用 Go to slot 对话框生成槽函数框架,将生成 3 个槽函数,并且每个槽函数的代码是相同的。为此,我们在窗口类 Widget 中自定义一个槽函数 do_valueChanged(),然后在 Widget 类的构造函数中将 3 个组件的 valueChanged()信号与这个自定义槽函数关联。
文件 widget.c 中的主要代码如下:
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{
ui->setupUi(this);
//将表盘、滑动条、卷滚条的 valueChanged()信号与自定义槽函数关联
connect(ui->slider,SIGNAL(valueChanged(int)), this, SLOT(do_valueChanged(int)));
connect(ui->scrollBar,SIGNAL(valueChanged(int)),this, SLOT(do_valueChanged(int)));
connect(ui->dial,SIGNAL(valueChanged(int)), this, SLOT(do_valueChanged(int)));
}
void Widget::do_valueChanged(int value)
{//自定义槽函数
ui->progressBar->setValue(value); //设置进度条的 value
}
void Widget::on_chkBox_Visible_clicked(bool checked)
{//textVisible 复选框
ui->progressBar->setTextVisible(checked);
}
void Widget::on_chkBox_Inverted_clicked(bool checked)
{//InvertedAppearance 复选框
ui->progressBar->setInvertedAppearance(checked);
}
void Widget::on_radio_Percent_clicked()
{//“显示格式--百分比”单选按钮
ui->progressBar->setFormat("%p%"); //进度条显示百分比
}
void Widget::on_radio_Value_clicked()
{//“显示格式--当前值”单选按钮
ui->progressBar->setFormat("%v"); //进度条显示数值
}