当前位置: 首页 > news >正文

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

显示方式

  • QLineEdit::Normal:默认值,文本框会显示输入的文本
  • QLineEdit::Password:这种模式下输入的字符会被隐藏, 通常用星号(*)或等号(=)代替
  •  QLineEdit::NoEcho:在这种模式下,文本框不会显示任何输入 的字符,单实际上其实是输入了的
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

垂直方向滚动条的出现策略

  • Qt::ScrollBarAsNeeded:根据内容自动决定是否需要滚动条,默认是这个
  • Qt::ScrollBarAlwaysOff:总是关闭滚动条
  • Qt::ScrollBarAlwaysOn:总是显示滚动条
horizontalScrollBarPolicy

水平方向滚动条的出现策略

  • Qt::ScrollBarAsNeeded:根据内容自动决定是否需要滚动条,默认是这个
  • Qt::ScrollBarAlwaysOff:总是关闭滚动条
  • Qt::ScrollBarAlwaysOn:总是显示滚动条

常用信号如下:

信号说明
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

按钮上的图标:

  • UpDownArrows:上下箭头形式
  • PlusMinus:加减号形式
  • NoButtons:没有按钮
accelerated(加速的)按下按钮时是否为快速调整模式
correctionMode

输入有误时如何修正

  • QAbstractSpinBox::CorrectToPreviousValue:如果用户输入了一个无效的值(例如,在只能显示正整数的SpinBox中输入了负数),那么 SpinBox会恢复为上一个有效值。例如,如果SpinBox的初始值是1,用户输入了-1(无效),然后SpinBox会恢复为1
  • QAbstractSpinBox::CorrectToNearestValue :如果用户输入了一个无效的值,SpinBox会恢复为最接近的有效值。例如,如果SpinBox的初始值是1,用户输入了-1(无效),那么SpinBox会恢复为0
keyboardTrack

是否开启键盘跟踪:

  • 设为true,每次在输入框输入一个数字,都会触发一次 valueChanged() 和 textChanged() 信号
  • 设为false,只有在最终按下 enter 或者输入框失去焦点才会触发 valueChanged() 和 textChanged() 信号

涉及到的主要信号有:

信号说明
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

  • y:表示年份
  • M:表示月份
  • d:表示日期
  • H:表示小时
  • m:表示分钟
  • s:表示秒

注意:这里的格式化符号的含义,不要死记,不同语言/库的设定规则是存在差异的,⼀定是用的时候再去查

minimumDateTime最小时间日期
maximumDateTime最大时间日期
timeSpec
  • Qt::LocalTime:显示本地时间
  • Qt::UTC:显示协调世界时(UTC) 
  • Qt::OffsetFromUTC:显示相对于UTC的偏移量(时差)

主要涉及到的信号有:

信号说明
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);
}

效果如下:

 

http://www.lryc.cn/news/587885.html

相关文章:

  • 消费 Kafka 一个TOPIC数据,插入到另一个KAFKA的TOPIC
  • Docker配置国内镜像源
  • CompletableFuture 源码解析
  • Linux 系统下的 Sangfor VDI 客户端安装与登录完全攻略 (CentOS、Ubuntu、麒麟全线通用)
  • HTTP协议版本对比
  • Apache部署
  • Ubuntu-25.04 Wayland桌面环境安装Anaconda3之后无法启动anaconda-navigator问题解决
  • Can201-Introduction to Networking:Data Plane数据平面
  • vue2/3生命周期使用建议
  • hive的相关的优化
  • Linux 系统管理基础教程
  • 图像分割论文中的评价指标
  • 从零实现一个基于 mem0的具有长期记忆的Text2SQL代理
  • R 语言科研绘图第 64 期 --- 哑铃图
  • 当前(2024-07-14)视频插帧(VFI)方向的 SOTA 基本被三篇顶会工作占据,按“精度-速度-感知质量”三条线总结如下,供你快速定位最新范式
  • 设计模式》》门面模式 适配器模式 区别
  • js与vue基础学习
  • Linux 基础命令详解:从入门到实践(1)
  • 基于Hadoop的竞赛网站日志数据分析与可视化(上)
  • STM32介绍和GPIO
  • Spring Boot启动原理:从main方法到内嵌Tomcat的全过程
  • Datawhale AI夏令营-基于带货视频评论的用户洞察挑战赛
  • [Python] -实用技巧4-Python中浅拷贝与深拷贝的区别详解
  • 工业软件加密锁复制:一场技术与安全的博弈
  • 借助DeepSeek编写输出漂亮表格的chdb客户端
  • 终端安全最佳实践
  • IIS错误:Service Unavailable HTTP Error 503. The service is unavailable.
  • SpringAi笔记
  • OpenCV 视频处理与摄像头操作详解
  • MySQL Innodb Cluster配置