QT跨平台应用程序开发框架(7)—— 常用输入类控件
目录
一,Line Edit
1.1 主要属性
1.2 录入信息
1.3 正则表达式
1.4 验证两次密码一致
1.5 切换显示密码
二,Text Edit
2.1 主要属性
2.2 获取输入内容
2.3 各种信号演示
三,Combo Box
3.1 主要属性
3.2 模拟点餐
3.3 从文件中加载选项
四,Spin Box
4.1 主要属性
4.2 点餐系统升级
五,Date Edit & Time Edit
5.1 主要属性
5.2 日期计算器
5.3 一个小问题
六,Dial
6.1 主要属性
6.2 调整透明度
七,Slider
7.1 主要属性
7.2 调整窗口大小
7.3 通过快捷键调整
一,Line Edit
1.1 主要属性
QLineEdit 用来表示单行输入框,可以输入一段文本,单不支持换行,主要属性如下:
属性 | 说明 |
---|---|
text | 输入框中的文本(代码和用户的输入都会影响 text 值) |
inputMask | 输入内容格式约束 |
maxLength | 可输入内容的最大长度 |
frame | 是否添加边框 |
echoMode | 显示方式
|
cursorPosition | 光标所在位置 |
alignment | 文字对齐方式,设置水平和垂直方向的对齐 |
dragEnabled | 是否允许拖拽 |
readOnly | 是否是只读的(不允许修改) |
placeHolderText | 当输入框内容为空时,显示什么样的提示信息 |
clearButtonEnabled | 是否会自动显示出“清除按钮” |
常用的信号如下:
属性 | 说明 |
---|---|
void cursorPositionChanged(int old, int new) | 当鼠标移动时发出此信号,old为先前的位置,new为新位置 |
void editingFinished() | 当按返回或回车键时,或行编辑失去焦点时,发出此信号 |
void returnPressed() | 当返回或回车键按下时发出此信号 如果设置了验证器,必须要验证通过才能触发 |
void selectionChanged() | 当选中的文本改变时,发出此信号 |
void textChanged(const QString &text) | 当 QLineEdit 中的文本改变时,发出此信号 text是新的文本,代码对文本的修改能够触发这个信号 |
void textEdited(const QString &text)) | 当 QLineEdit 中的文本改变时,发出此信号 text是新的文本,代码对文本的修改不能触发这个信号 |
1.2 录入信息
我们搞一个程序,可以让用户输入一些信息,然后点击提交按钮后把这些信息获取到,先创建下列控件:
代码如下:
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<QString>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->lineEdit_name->setPlaceholderText("请输入姓名");ui->lineEdit_name->setClearButtonEnabled(true); //添加清空按钮ui->lineEdit_password->setPlaceholderText("请输入密码");ui->lineEdit_phone->setClearButtonEnabled(true);ui->lineEdit_password->setEchoMode(QLineEdit::Password); //将密码设置成不可见ui->lineEdit_phone->setPlaceholderText("请输入手机号码");ui->lineEdit_phone->setClearButtonEnabled(true);ui->lineEdit_phone->setInputMask("000-0000-0000"); //setInputMask 表示限制输入格式,数字0代表只能输入数字,并且输入11个数后无法再次输入
}Widget::~Widget()
{delete ui;}void Widget::on_pushButton_submit_clicked()
{QString gender = ui->radioButton_male->isChecked() ? "男" : "女";qDebug() << "姓名:" << ui->lineEdit_name->text()<< "密码:" << ui->lineEdit_password->text()<< "性别:" << gender<< "电话:" << ui->lineEdit_phone->text();
}
效果如下:
1.3 正则表达式
上面的 inputMask 功能有限,只能进行简单的验证,要想进行更复杂的验证,就要使用“正则表达式”
关于“正则表达式”:
- 计算机中的通用概念,与具体的编程语言无关
- 本质上就是一个带有特殊字符的字符串,其中的特殊字符用来表示另一个字符串的特征
- 此时就可以借助正则表达式来描述出一些具有一定特点的字符串
- 基于这些特点就可以完成字符串的匹配
- 正则表达式涉及到的特殊符号都很抽象,记是记不住的,所以只能要用的时候去查一下,文档如下:
参考文档:正则表达式语法 | Microsoft Learn
辅助工具:正则表达式语法测试工具 - 在线工具
下面来简单演示一下:
先创建一个输入框和一个按钮:
并且输入框右键转到槽:
我们开始把按钮设置成禁用状态,我们的期望是:当在输入框中输入的是一个合法的手机号码后,按钮才会被设为可用,否则按钮保持禁用,代码如下:
#include<QString>
#include<QRegExpValidator>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//给单行编辑框设置基于正则表达式的验证器QRegExp regExp("^1\\d{10}$"); //简单的验证手机号码的正则表达式//^表示以什么开头,1表示以1开头//\d表示整数,\\表示让C++不要转义,{10}表示必须输入10个整数,$表示结尾ui->lineEdit->setValidator(new QRegExpValidator(regExp)); //设置一个验证器,后面表示这是一个基于正则表达式的验证器//注意:上面只是注册一个验证器,具体怎么使用还需要其它代码来完成//只要输入框中的内容一发生变化,就执行一次验证操作}Widget::~Widget()
{delete ui;
}void Widget::on_lineEdit_textChanged(const QString &text) //当输入框内容梅发生一次变化,就会执行一次这个函数,text表示当前输入框中的内容
{QString content = text; //参数是const,但是validate函数参数是非const,所以需要转换一下int pos = 0;if(ui->lineEdit->validator()->validate(content, pos) == QValidator::Acceptable)//validate 的返回值是一个 State 对象,里面有三个枚举,其中常用的就是 Invalid 和 Acceptable,表示合法和不合法{//验证通过的逻辑,要将按钮设置为可用状态ui->pushButton->setEnabled(true);}else{//验证不通过的逻辑,将按钮设置为禁用状态ui->pushButton->setEnabled(false);}
}
对于 validate 函数的两个参数
- 第一个参数表示要验证的字符串,类型是 QString&,不是 const,因为我们是可以自定义 validator 方法的,就是我们可以自己去重写这个函数,所以是非 const 引用
- 第二个参数是一个输出型参数,表示如果你的字符串不符合规则,是从哪个位置开始不符合的,但是很少用
效果如下:
1.4 验证两次密码一致
这个功能相信各位小伙伴也不陌生,下面我们来实现一下
先搞一些控件:
然后两个输入框都转到槽:
我们的期望是当两次输入的密码一致时,就修改上面 label 的内容,代码如下:
//两个槽函数的逻辑一样,可以单独搞一个函数执行逻辑,然后让两个函数都调用一下即可
void Widget::on_lineEdit_textChanged(const QString &arg1)
{const QString& s1 = ui->lineEdit->text();const QString& s2 = ui->lineEdit_2->text();if(s1.isEmpty() && s2.isEmpty()) ui->label->setText("密码为空");else if(s1 == s2) ui->label->setText("两次输入的密码一致了!");else ui->label->setText("两次密码不一致");
}void Widget::on_lineEdit_2_textChanged(const QString &arg1)
{const QString& s1 = ui->lineEdit->text();const QString& s2 = ui->lineEdit_2->text();if(s1.isEmpty() && s2.isEmpty()) ui->label->setText("密码为空");else if(s1 == s2) ui->label->setText("两次输入的密码一致了!");else ui->label->setText("两次密码不一致");
}
效果如下:
1.5 切换显示密码
针对密码,可以切换“显示密码”状态,下面我们来实现一下
先创建两个控件:
checkBox 转到这个槽,表示选中状态切换时,会触发信号:
我们的期望是当框框按钮选中时,将密码显示出来,取消选中时,密码变回黑豆豆形态,如下代码:
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<QString>
#include<QRegExpValidator>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->lineEdit->setEchoMode(QLineEdit::Password);
}Widget::~Widget()
{delete ui;
}void Widget::on_checkBox_toggled(bool checked) //选中时为true,取消选中时为false
{if(checked == true){ui->lineEdit->setEchoMode(QLineEdit::Normal);}else{ui->lineEdit->setEchoMode(QLineEdit::Password);}
}
效果如下:
注:上面的一些都是很简单的例子,但是如果全都串在一起就不简单了
二,Text Edit
2.1 主要属性
QTextEdit 表示多行输入框,也是一个富文本 & markdown 编辑器,并且自动添加滚动条
多行输入框的还有一个 QPlainTextEdit,这个只能表示纯文本
QTextEdit 主要属性如下:
属性 | 说明 |
---|---|
markdown | 输入框内特有的内容,支持markdown,能自动将其渲染成 html |
html | 输入框内特有的内容,支持大部分html标签,包括 img 和 table |
placeHolderText | 输入框为空时提示的内容 |
readOnly | 是否是只读的 |
undoRedoEnable | 是否开启 undo(ctrl+z 撤销) / redo(ctrl+y 撤销撤销) 模式 |
autoFormating | 开启自动格式化 |
tabstopWidth | 按下Tab缩进占多少空间 |
overwriteMode | 是否开启覆写模式 |
acceptRichText | 是否接收富文本内容 |
verticalScrollBarPolicy | 垂直方向滚动条的出现策略
|
horizontalScrollBarPolicy | 水平方向滚动条的出现策略
|
常用信号如下:
信号 | 说明 |
---|---|
textChanged() | 文本内容改变时改变 |
selectionChanged() | 选中范围改变时触发 |
cursorPositionChanged() | 光标移动时触发 |
undoAvailable(bool) | 可以进行 undo 操作时触发 |
redoAvailable(bool) | 可以进行 redo 操作时触发 |
copyAvaiable(bool) | 文本被 选中/取消选中 时触发 |
2.2 获取输入内容
先创建一个 label 和一个 Text Edit,:
然后我们的期望是不论我们在输入框中输入什么内容,都在上面的label中进行同步,所以我们右键输入框转到槽:
这个表示每次输入框的内容发生改变时,都触发一个这样的信号,槽函数代码如下:
void Widget::on_textEdit_textChanged()
{//获取到多行输入框的内容const QString& text = ui->textEdit->toPlainText();ui->label->setText(text);
}
效果就是我们在输入框中输入字符,上面的label会同步显示,由于太简单就不贴演示了
2.3 各种信号演示
以上面的模板为例,我们分别创建下面的槽函数:
①
void Widget::on_textEdit_selectionChanged()
{//这个表示我们的光标选中发生改变时触发QTextCursor cursor = ui->textEdit->textCursor(); //用于获取光标的一些情况qDebug() << "selectionChanged:" << cursor.selectedText(); //获取光标选中的内容是哪些
}
②
void Widget::on_textEdit_cursorPositionChanged()
{//这个表示光标的位置发生改变时,触发此信号QTextCursor cursor = ui->textEdit->textCursor();qDebug() << "光标位置为:" << cursor.position(); //打印光标位置
}
其它的信号可以参考上面的表格,以及结合文档查询去使用
三,Combo Box
3.1 主要属性
QComboBox 表示下拉框,主要属性如下:
属性 | 说明 |
---|---|
currentText | 当前选中的文本 |
currentIndex | 当前选中的条目下标 从0开始算,如果没有选中值为 -1 |
editable | 是否允许修改 如果设为 true,QComboBox 的行为就很接近 QLineEdit,也可以设置 validator |
iconSize | 下拉框图标的大小 |
maxCount | 最多允许有多少个条目 |
最常用的方法(函数)如下:
方法(函数) | 说明 |
---|---|
additem(const QString&) | 添加一个条目 |
currentIndex() | 获取当前条目下标,和属性一致 |
currentText() | 获取当前条目的文本内容 |
主要涉及到的信号如下:
信号 | 说明 |
---|---|
activated(int) activated(constQString&text) | 当用户选择了一个选项时发出
|
currentIndexChanged(int) currentIndexChanged(constQString &text) | 当前选项改变时发
|
editTextChanged(constQString& text) | 当编辑框中文本改变时发出(editable 为 true 时有效) |
3.2 模拟点餐
这个例子我们前面介绍单选框时已经实现过了,这里我们就再实现一个下拉框形式的模拟点餐系统,先创建下列控件:
代码如下:
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<QString>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->comboBox->addItem("");ui->comboBox->addItem("蛋包饭");ui->comboBox->addItem("大汉堡");ui->comboBox->addItem("全鸡");ui->comboBox_2->addItem("");ui->comboBox_2->addItem("薯条");ui->comboBox_2->addItem("鸡块");ui->comboBox_2->addItem("鸡翅");ui->comboBox_3->addItem("");ui->comboBox_3->addItem("可乐");ui->comboBox_3->addItem("果汁");ui->comboBox_3->addItem("矿泉水");
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{QString c1 = ui->comboBox->currentText();QString c2 = ui->comboBox_2->currentText();QString c3 = ui->comboBox_3->currentText();QString ret = "您点的食物为:";if(c1.isEmpty() && c2.isEmpty() && c3.isEmpty()){ui->label_4->setText("您还未选择任何食物哦");return;}if(!c1.isEmpty()) ret += c1;if(!c2.isEmpty()){if(!c1.isEmpty()) ret += ",";ret += c2;}if(!c3.isEmpty()){if(!c1.isEmpty() || !c2.isEmpty()) ret += ",";ret += c3;}ui->label_4->setText(ret);
}
效果如下:
附:上面我们是直接在代码里给下拉框添加选项,我们还可以直接在ui界面添加的,如下:
3.3 从文件中加载选项
下拉框中的内容,很多时候是通过 文件/网络 加载数据得到的,先创建如下控件:
然后在任意路径下创建一个 txt 文档,填写类似如下内容后保存好并复制路径:
代码如下:
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<QString>
#include<fstream>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//需要读取文件内容,读取每一行,作为 Combobox 的选项std::ifstream file("C:/Users/PC/Desktop/offer.txt");if(!file.is_open()){qDebug() << "file open failed!";return;}//成功打开,然后使用 getline 来按行读取文本内容std::string line;while(std::getline(file, line)){//取到的每一行内容都设置到下拉框中ui->comboBox->addItem(QString::fromStdString(line)); //这个静态函数是把 std::string 转换成 QString//QString s;//s.toStdString(); //这就是将 QString 转换成 std::string}file.close();
}Widget::~Widget()
{delete ui;
}
四,Spin Box
4.1 主要属性
QSpinBox 叫做微调框,由于QSpinBox 和 QDoubleSpinBox 用法基本相同,这里就只介绍 QSpingBox了,主要属性如下:
属性 | 说明 |
---|---|
value | 存储的数值 |
singleStep | 每次按下一次按钮,数据变化多少 |
displayInteger | 数字的进制 例如 displayInteger 设为 10,则是按照 10 进制表示 设为 2 则为 2 进制表示 |
minimum | 可调整的最小值 |
maximum | 可调整的最大值 |
suffix | 后缀 |
prefix | 前缀 |
wrapping | 是否允许换行 |
frame | 是否带边框 |
alignment | 文字对齐方式(水平,垂直) |
readOnly | 是否允许修改 |
buttonSymbol | 按钮上的图标:
|
accelerated(加速的) | 按下按钮时是否为快速调整模式 |
correctionMode | 输入有误时如何修正
|
keyboardTrack | 是否开启键盘跟踪:
|
涉及到的主要信号有:
信号 | 说明 |
---|---|
textChanged(QString) | 微调框的文本发生改变时会触发 参数QString带有前缀和后缀 |
valueChanged(int) | 微调框的文本发生改变时会触发 参数int,表示当前的数值 |
4.2 点餐系统升级
代码如下:
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<QString>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->comboBox->addItem("蛋包饭");ui->comboBox->addItem("大汉堡");ui->comboBox->addItem("全鸡");ui->comboBox_2->addItem("薯条");ui->comboBox_2->addItem("鸡块");ui->comboBox_2->addItem("鸡翅");ui->comboBox_3->addItem("可乐");ui->comboBox_3->addItem("果汁");ui->comboBox_3->addItem("矿泉水");//针对 QSpinBox 的范围进行设置ui->spinBox->setRange(0, 5);ui->spinBox_2->setRange(0, 5);ui->spinBox_3->setRange(0, 5);//设置初始值ui->spinBox->setValue(1);ui->spinBox_2->setValue(1);ui->spinBox_3->setValue(1);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{//获取食物种类QString c1 = ui->comboBox->currentText();QString c2 = ui->comboBox_2->currentText();QString c3 = ui->comboBox_3->currentText();//获取食物数量QString a1 = QString::number(ui->spinBox->value()); //将 int 类型转成 qstring 类型QString a2 = QString::number(ui->spinBox_2->value());QString a3 = QString::number(ui->spinBox_3->value());QString ret = "您点的食物为:";if(a1 == "0" && a2 == "0" && a3 == "0"){ui->label_4->setText("您还未选择任何餐品哦");return;}if(a1 != "0"){ret += a1 += "份";ret += c1;}if(a2 != "0"){if(a1 != "0") ret += ",";ret += a2 += "份";ret += c2;}if(a3 != "0"){if(a1 != "0" || a2 != "0") ret += ",";ret += a3 += "瓶";ret += c3;}ui->label_4->setText(ret);
}
效果如下:
五,Date Edit & Time Edit
5.1 主要属性
QDateEdit 是作为日期的微调框,QTimeEdit 是作为时间的微调框,而 QDateTimeEdit 是作为时间和日期的微调框,这几个控件使用起来很相似,所以我们只介绍下 QDateTimeEdit,主要属性如下:
属性 | 说明 |
---|---|
dateTime | 时间日期的值,例如 2025/7/13 0:00:00 |
date | 单纯日期的值,例如 2025/7/13 |
time | 单纯时间的值,例如 0:00:00 |
displayFormat | 时间日期格式,例如 yyyy/M/d H:mm
注意:这里的格式化符号的含义,不要死记,不同语言/库的设定规则是存在差异的,⼀定是用的时候再去查 |
minimumDateTime | 最小时间日期 |
maximumDateTime | 最大时间日期 |
timeSpec |
|
主要涉及到的信号有:
信号 | 说明 |
---|---|
dateChanged(QDate) | 日期改变时触发 |
timeChanged(QTime) | 事件改变时触发 |
dateTimeChanged(QDateTime) | 时间日期任意一个改变时触发 |
5.2 日期计算器
这个就是计算两个时间中间时隔是多少天/多少小时,创建下列控件:
主要就是实现下按钮槽函数的计算逻辑。如下代码:
void Widget::on_pushButton_clicked()
{//1,先获取到两个输入框的时间QDateTime timeBefore = ui->dateTimeEdit->dateTime();QDateTime timeAfter = ui->dateTimeEdit_2->dateTime();//2,计算差值,使用QDateTime 提供的两个函数int days = timeBefore.daysTo(timeAfter);//daysTo 计算两个时间的日期的差值int seconds = timeBefore.secsTo(timeAfter);//secsTo 计算两个时间的秒数的差值//3,把小数换算成小时int hours = (seconds / 3600) % 24; //得到不足一天24小时的小时数//4,设置结果ui->label->setText(QString("相差了") + QString::number(days) + QString("天") + QString::number(hours) + QString("小时"));
}
效果如下:
5.3 一个小问题
先看下图:
可以看到,1号的下午五点到2号的凌晨0点,中间是只隔了7小时的,但是多算进去了一天
Qt 文档中也给出了该函数可能存在的一些问题:
所以我们需要修改下代码逻辑:
效果如下:
六,Dial
6.1 主要属性
QDial 表示一个旋钮,主要属性如下:
属性 | 说明 |
---|---|
value | 持有的数值 |
minimum | 最小值 |
maximun | 最大值 |
singleStep | 按下方向键的时候改变的步长 |
pageStep | 按下 pageUp / pageDown 的时候改变的步长 |
sliderPosition | 界面上旋钮显示的初始位置 |
tracking | 外观是否会跟踪数值变化(默认为 true,一般不改) |
wrapping | 是否允许循环调整 就是数值超过最大值,是否允许回到最小值 |
notchesVisible | 是否显示刻度线 |
notchTarget | 刻度线之间的相对位置,数字越大,刻度线越稀疏 |
主要信号有:
属性 | 说明 |
---|---|
valueChanged(int) | 数值改变时触发 |
rangeChanged(int, int) | 范围改变时触发 |
6.2 调整透明度
先创建下列控件:
这个槽函数表示当 value 的值发生改变时,发出此信号,代码如下:
void Widget::on_dial_valueChanged(int value)
{this->setWindowOpacity((double) value / 100); //透明度是一个 0-1 的小数
}
效果如下:
七,Slider
7.1 主要属性
QSlider 表示一个滑动条,并且和 QDial 一样,都是继承自 QAbstractSlider,所以用法基本相同,主要属性如下:
属性 | 说明 |
---|---|
value | 持有的数值 |
minimum | 最小值 |
maximun | 最大值 |
singleStep | 按下方向键的时候改变的步长 |
pageStep | 按下 pageUp / pageDown 的时候改变的步长 |
sliderPosition | 滑动条显示的初始位置 |
tracking | 外观是否会跟踪数值变化(默认为true,一般不改) |
orientation | 滑动条的方向是水平还是垂直 |
invertedAppearance | 是否要翻转滑动条的方向 |
tickPosition | 刻度的位置 |
tickInterval | 刻度的密集程度 |
主要信号如下:
属性 | 说明 |
---|---|
valueChanged(int) | 数值改变时触发 |
rangeChanged(int, int) | 范围改变时触发 |
7.2 调整窗口大小
我们的期望是创建一个水平和一个垂直滑动条,可以通过滑动条来调整窗口大小:
都转到槽 valueChanged(int) 表示当值改变时发出信号:
代码如下:
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->horizontalSlider->setMinimum(100);ui->horizontalSlider->setMaximum(2000); //设置最大和最小值ui->horizontalSlider->setValue(800); //初始值ui->horizontalSlider->setSingleStep(50); //每次调整多少ui->verticalSlider->setMinimum(100);ui->verticalSlider->setMaximum(2000);ui->verticalSlider->setValue(800);ui->verticalSlider->setSingleStep(50);
}Widget::~Widget()
{delete ui;
}void Widget::on_horizontalSlider_valueChanged(int value)
{const QRect& rect = this->geometry();this->setGeometry(rect.x(), rect.y(), value, rect.height());
}void Widget::on_verticalSlider_valueChanged(int value)
{const QRect& rect = this->geometry();this->setGeometry(rect.x(), rect.y(), rect.width(), value);
}
效果如下:
7.3 通过快捷键调整
滑动条本身是可以通过方向键 和 pageUp 和 pageDown 操作的,但是咱们也可以自定义快捷键
先创建一个滑动条和label,让label显示滑动条的值:
其实这里重要的不受滑动条怎么调整的,而是熟悉下快捷键如何设置的,后面的控件设置快捷键的步骤都可以按照下面的方式进行设置,代码如下:
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<QShortcut>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//使用快捷键,需要用到 QShortCut 类,“ - ” 键进行减少,“ = ” 键进行增加QShortcut* s1 = new QShortcut(this);s1->setKey(QKeySequence("-")); //指定哪个键作为快捷键QShortcut* s2 = new QShortcut(this);s2->setKey(QKeySequence("=")); //指定哪个键作为快捷键//使用信号槽,使程序感知到快捷键被按下connect(s1, &QShortcut::activated, this, &Widget::subValue);connect(s2, &QShortcut::activated, this, &Widget::addValue);
}Widget::~Widget()
{delete ui;
}void Widget::on_horizontalSlider_valueChanged(int value)
{ui->label->setText("当前的值为:" + QString::number(value));
}void Widget::subValue() //记得声明
{int value = ui->horizontalSlider->value();if(value <= ui->horizontalSlider->minimum()) return;ui->horizontalSlider->setValue(value - 5);
}void Widget::addValue()
{int value = ui->horizontalSlider->value();if(value >= ui->horizontalSlider->maximum()) return;ui->horizontalSlider->setValue(value + 5);
}
效果如下: