自学内容网 自学内容网

Qt常用控件之输入类控件

目录

QLineEdit

输入个人信息案例

正则表达式

验证两次密码是否一致

切换显示密码状态

QTextEdit

QComboBox

模拟麦当劳点餐

通过文件加载下拉框内容

QSpinBox

升级版麦当劳点餐

QDateTimeEdit

时间计算器

QDial

QSlider


QLineEdit

QLineEdit 用来表示单行输入框,可以输入一段文本,但是不能换行

核心属性

            属性                                                          说明
            text输入框中的文本 (通过代码或直接操作界面的文本框,都会改变test属性)
       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(constQString &text)当OLineEdit中的文本改变时,发出此信号
text是新的文本
代码对文本的修改能够触发这个信号
void textEdited(const QString &text))当QLineEdit中的文本改变时,发出此信号
text是新的文本
代码对文本的修改不能触发这个信号

输入个人信息案例

创建下面的控件:

并改变它们的 objectName,方便后续修改时调用:


初始化第一个输入框,设置 提示信息 和 删除按钮:

结果为:

  

初始化第二个输入框,设置 提示信息、删除按钮 和 显示密码的格式:

结果为:

初始化第三个输入框,设置 提示信息、删除按钮 和 格式约束:

此时第三个输入框,只能输入11位数字,再按键盘没有任何反应:


下面将 QPushButton 转到槽,编写 QPushButton 的槽函数:

运行程序,输入下面的信息:

此时在 控制板 上就会打印输入的信息:


此处咱们只是进行简单打印,实际开发中可以通过网络把数据发给服务器


正则表达式

inputMask 功能比较有限,只能进行简单的验证,像我们上面实现的个人信息中的电话时,只能限制是 11位 数字,并不能有其他限制
如果想让电话号码第一位只能输入 1 这种限制条件,就需要使用 正则表达式

正则表达式是计算机中的通用概念,和具体的编程语言无关
正则表达式,本质上就是一个带有特殊字符的字符串,特殊字符用来表示另一个字符串的特征,此时就可以借助正则表达式来描述出一些具有一定特点的字符串
基于这些特点,就可以完成字符串的匹配

下面在 图形化界面 中,拖动一个 LineEdit 和 一个按钮,并把这个按钮的 enabled 属性取消勾选,设为 不可提交:

此处的规则是

  • 输入框要检查输入的内容是否是合法的手机号码
  • 如果是,则按钮设为可用状态;如果不是,则设为禁用状态

在构造函数中写正则表达式:

这是一个简单的验证手机号码的正则表达式

  • ^ 表示以 xxx 开头,后面跟着的 1,意思就是以 1开头
  • \d 表示数字,为了在 C++ 字符串中使用,需要写作 \\d
  • {10} 表示前面的内容重复出现 10 次,\d 数字要重复出现 10 次
  • $ 表示结尾了

设置完正则表达式后,还需要验证器基于正则表达式进行验证:

下面再右键 LineEdit,点击 转到槽,选择 textEdited,表示输入框的内容发生改变时发出信号:

  • 通过 ui->lineEdit->validator() 获取验证器
  • 通过 ui->lineEdit->validator()->validate() 执行验证器的验证方法
  • validate函数的参数是 validate(QString& , int&)
  • 第一个参数是要验证的字符串,参数类型是 QString&,而不是 const QString&,所以不能直接使用槽函数的 test 参数
  • 第二个参数表示,如果你的字符串不符合规则,是从哪个位置开始不符合的(没有什么用,调用该函数时传入即可)

下面运行程序,按钮不允许点击:

输入符合正则表达式的电话号码后,按钮就允许点击了,并且这里第一个数字必须是1,按其他数字无法输入:


验证两次密码是否一致

验证两次密码是否一致,这样的场景我们经常遇到,在设置密码时,往往需要我们输入两次密码,来确保我们两次输入的密码是一样的

下面创建 一个Label 和 两个QLineEdit:

先初始化两个输入框:

两个 LineEdit 都分别 转到槽,由于这两个槽函数代码逻辑比较类似,都是比较两次密码是否相同,所以可以创建一个 compare 函数完成比较功能,两个槽函数调用 compare函数 即可:

之所以在两个槽函数中,添加 (void)arg1 这种语句,是因为我们并没有使用槽函数提供的参数,此时就会报警告,为了消除这个警告,就加上这个强制类型转换的语句,既不会影响代码的结果,也可以消除警告

运行程序,刚开始会显示密码为空:

第一个和第二个输入框的密码不同时:

第一个和第二个输入框的密码相同时:


切换显示密码状态

针对输入的密码,可以切换"显示密码"状态,日常也使用比较多

下面拖动一个 LineEdit 和一个 checkBox:

接下来可以将 check Box 转到槽,选择 toggle 信号,表示切换状态时发送信号:

运行程序,初始情况下是 PassWord 模式的:

勾选显示密码,就变为 Normal 模式了,可以显示输入的密码:


QTextEdit

QTextEdit 表示多行输入框,也是一个富文本&markdown 编辑器
并且能在内容超出编辑框范围时自动提供滚动条

Qt 中表示多行输入框有两种选择:

  • QTextEdit:不仅能表示纯文本,还可以表示 html和 markdown
  • QPlainTextEdit:只能表示纯文本(Plain Text)

除了格式不同之外,剩下都是大同小异的,下面以 QTextEdit 为例进行讲解

核心属性

                 属性                                                        说明
            markdown输入框内持有的内容,支持 markdown 格式
能够自动的对 markdown 文本进行渲染成 html
                html输入框内持有的内容
可以支持大部分 html标签,包括 img 和 table 等
       placeHolderText输入框为空时提示的内容
            readonly是否是只读的
      undoRedoEnable是否开启 undo/redo 功能
按下 ctrl+z 触发 undo
按下 ctrl+y 触发 redo
        autoFormating开启自动格式化
        tabstopWidth按下缩进占多少空间
       overwriteMode是否开启覆盖写模式
       acceptRichText是否接收富文本内容
 verticalScrollBarPolicy垂直方向滚动条的出现策略
Qt::ScrollBarAsNeeded:根据内容自动决定是否需要滚动条,这是默认值
Qt::ScrollBarAlwaysoff:总是关闭滚动条
Qt::ScrollBarAlwavson:总是显示滚动条
horizontalScrollBarPolicy水平方向滚动条的出现策略
Qt::ScrollBarAsNeeded:根据内容自动决定是否需要滚动条,这是默认值
Qt::ScrollBarAlwaysoff:总是关闭滚动条
Qt::ScrollBarAlwayson:总是显示滚动条

核心信号

信号说明
textChanged()文本内容改变时触发
selectionchanged()选中范围改变时触发
cursorPositionchanged()光标移动时触发
undoAvailable(bool)可以进行 undo 操作时触发
redoAvailable(bool)可以进行 redo 操作时触发
copyAvaiable(bool)文本被选中/取消选中时触发

下面创建一个 Label 和一个 TextEdit,在 TextEdit 中输入的内容,显示到 Label 中:

右键 TextEdit 转到槽,选择 textChanged(),表示文本发送改变就调用这个槽函数,可以让我们在 Label 中实时显示信息:

toPlainText() 表示显示多行输入框中的文本内容

运行程序,最开始是:

在多行输入框中输入内容,变为:


右键 TextEdit 转到槽,其中 selectionchanged() 和 cursorPositionchanged() 信号,都是采用 QTextCursor 来获取实际的选中的范围和光标移动的位置的

下面是槽函数的书写:

运行程序:

可以看到在选中内容时,会显示选中的内容,在光标移动时,会显示光标所在的位置


QComboBox

QComboBox 表示下拉框

核心属性:

属性说明
currentText当前选中的文本
currentindex当前选中的条目下标
从 0开始计算,如果当前没有条目被选中,值为 -1
editable是否允许修改
设为 true 时,QComboBox 的行为就非常接近 QLineEdit, 也可以设置 validator
iconSize下拉框图标(小三角)的大小
maxCount最多允许有多少个条目

核心方法:

方法说明
addltem(const QString&)添加一个条目
currentindex()获取当前条目的下标
从 0开始计算.如果当前没有条目被选中,值为 -1
currentText()获取当前条目的文本内容

核心信号:

信号说明
activated(int)
activated(const QString & text)
当用户选择了一个选项时发出
这个时候相当于用户点开下拉框,并且鼠标划过某个选项此时还没有确认做出选择

currentIndexChanged(int)

currentIndexChanged(const QString& text)

当前选项改变时发出
此时用户已经明确的选择了一个选项
用户操作或者通过程序操作都会触发这个信号
editTextChanged(const QString &text)当编辑框中的文本改变时发出
(editable 为 true 时有效)

模拟麦当劳点餐

在前面学习单选按钮时,也模拟实现过麦当劳点餐,这里使用下拉框的方式,也实现一次麦当劳点餐的效果

下面采用 图形化界面 的方式,创建下面几个控件:
也就是通过下拉框选择后,点击提交,就得到用户获取了哪些食物

接着就可以在构造函数中添加下拉框中的内容:

此时下拉框就可以选择不同的内容了:

接着将提交按钮点击转到槽,实现槽函数:

运行程序:

上述是通过代码的方式添加的,我们也可以通过图形化界面的方式添加:

输入内容即可:

上述两种方式都可以完成操作


通过文件加载下拉框内容

下拉框里的内容,很多时候不是代码中写死的,而是通过文件/网络加载数据得到的

例如选课操作,不同年级的不同的同学,所选择的课程都是不相同的

图形化界面方式创建:

接着我们创建一个文件:

在文件中编写:

接下来需要在构造函数中:读取文件内容,把文件中的每一行读取出来,作为一个ComboBox 的选项

运行程序:


QSpinBox

使用 QSpinBox 或者 QDoubleSpinBox 表示"微调框”,它是带有按钮的输入框,可以用来输入整数/浮点数,通过点击按钮来修改数值大小

由于 QSpinBox 或者 QDoubleSpinBox 用法基本相同,区别就是第一个是整数,第二个是小数,下面都介绍的是 QSpinBox

核心属性:

属性说明
value存储的数值
singlestep每次调整的"步长"按下一次按钮数据变化多少
displaylnteger数字的进制.例如 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,表示当前的数值

升级版麦当劳点餐

在选择完具体的食物后,后面多一个微调框选择个数

图形化界面的方式创建:

先完善下拉框的内容:

再创建按钮的槽函数:

运行程序:

点餐时0份是不合理的,100份也是不合理的,所以下面针对 QSpinBox 的范围进行设定:

此时运行程序默认为1,且份数不会小于1份大于5份:


QDateTimeEdit

  • 使用 QDateEdit 作为日期的微调框
  • 使用 QTimeEdit 作为时间的微调框
  • 使用 QDateTimeEdit 作为时间日期的微调框

这几个控件用法非常相似,我们以 QDateTimeEdit 为例进行介绍

核心属性:

属性说明
dateTime时间日期的值.形如 2000/1/1 0:00:00
date单纯日期的值.形如 2001/1/1
time单纯时间的值.形如0:00:00
displayFormat时间日期格式.形如 yyyy/M/d H:mm
  • y 表示年份
  • M 表示月份(M时是1,MM时是01)
  • d 表示日期
  • H 表示小时
  • m 表示分钟
  • s 表示秒
注意:这里的格式化符号的含义不要记忆,不同语言/库的设定规则是存在差异的,一定是用的时候再去查
minimumDateTime最小时间日期
maximumDateTime最大时间日期
timeSpecQt::LocalTime:显示本地时间
Qt::UTC:显示协调世界时(UTC)
Ot::OffsetFromUTC:显示相对于UTC的偏移量(时差)

核心信号:

信号说明
dateChanged(QDate)日期改变时触发
timeChanged(QTime)时间改变时触发
dateTimeChanged(QDateTime)时间日期任意一个改变时触发

时间计算器

计算两个时间中间的间隔是多少天/多少小时

图形化界面的方式创建:

计算的按钮的槽函数实现:

 daysTo 和 secsTo:

  • daysTo 计算两个时间的日期的差值
  • secsTo 计算两个时间的秒数的差值

(seconds / 3600) % 24 的含义是:

  • seconds 是一个非常大的数字,表示这两个时间日期中间隔了多少秒
  • 首先除以一个 3600,换算成小时了
  • 这两个时间中间隔了多少小时,重点是关心多出来的零头
  • 比如这里的结果是 100h(包含好几天了),重点是看这里的零头是多少,也就是 100 % 24

运行程序:


上述的代码写完,大部分计算结果都是对的,但是还是有问题的,例如:

1/1 20:00 距离 1/2 0:00 应该是间隔4小时的,而不是1天零4小时,所以需要改正

之所以出现上述情况,是因为我们所使用的 daysTo 函数,它规定如果 从晚上的 23:55 到第二天的 0:05 也是会算作一天的

而我们并不希望这样计算,所以我们也可以使用秒数转化为天数:

运行程序,结果是符合预期的:


QDial

使用 QDial 表示一个旋钮

有些程序,通过鼠标拖动旋钮旋转,即可完成一些相关的设置

核心属性:

属性说明
value持有的数值
minimum最小值
maximum最大值
singleStep按下方向键的时候改变的步长
pageStep按下 pageUp/pageDown 的时候改变的步长
sliderPosition界面上旋钮显示的初始位置
tracking外观是否会跟踪数值变化
默认值为 true,一般不需要修改
wrapping是否允许循环调整
即数值如果超过最大值,是否允许回到最小值调整过程能否"套圈")
notchesVisible是否显示 刻度线
notchTarget刻度线之间的相对位置,数字越大,刻度线越稀疏

核心信号:

信号说明
valueChanged(int)数值改变时触发
rangeChanged(int, int)范围变化时触发

图形化界面的方式创建旋钮:

右边的是否允许套圈和是否显示刻度线都勾选上:

就变为:

上述就是简单的了解这个旋钮的几个属性,下面使用代码的方式学习


下面编写代码,通过旋钮来控制窗口的不透明度(opacity)

  • 不透明度数值是一个 0-1 之间的小数
  • 1 完全不透明
  • 0 完全透明

图形化界面的方式创建旋钮,并通过右边的属性栏设置相关属性:

此时形状为:

下面右键旋钮,转到槽,选择 valueChanged(int) 也就是数值改变时触发信号,槽函数编写如下:

运行程序,旋钮旋转到50的时候,不透明度变为原来的一半:


QSlider

使用 QSlider 表示一个滑动条

0slider 和 QDial 都是继承自 QAbstractslider,因此用法上基本相同

核心属性:

属性说明
value持有的数值
minimum最小值
maximum最大值
singleStep按下方向键的时候改变的步长
pageStep按下 pageUp/pageDown 的时候改变的步长
sliderPosition滑动条显示的初始位置
tracking外观是否会跟踪数值变化
默认值为 true,一般不需要修改
orientation滑动条的方向是水平还是垂直
invertedAppearance是否要翻转滑动条的方向(默认从左往右变大)
tickPosition刻度的位置
tickInterval刻度的密集程度

核心信号:

信号说明
valueChanged(int)数值改变时触发
rangeChanged(int, int)范围变化时触发

滑动条控制窗口大小

下面编写代码实现:
在窗口上放两个滑动条,一个是水平,一个是垂直
滑动这两个滑动条,就能够调整窗口的大小

首先拖动两个滑动条:

先在构造函数中设置两个滑动条的基本属性:

再分别将两个滑动条转到槽,选择 valueChanged(int) 也就是数值改变时触发信号,实现槽函数:

运行程序,初始大小如下:

拖动滑动条,变为:


自定义快捷键,通过快捷键来操作滑动条

滑动条本身可以通过方向键和 pageUp pageDown 操作,但是我们也可以自定义

图形化界面创建:

转到槽,依旧是 valueChanged(int) 的槽函数:

此时就可以做到拖动滑动条,在标签上显示对应的数值:

下面在构造函数中,为了能够使用快捷键的方式操作滑动条,需要用到 QShortCut 类:

接下来使用信号槽,感知快捷键被按下,所以需要创建两个槽函数:

接着在构造函数中使用 connect 函数链接信号与槽:

subValue 和 addValue 槽函数实现如下:

此时运行程序,就可以通过快捷键操作滑动条了:


Qt常用控件之输入类控件到此结束啦


原文地址:https://blog.csdn.net/m0_64411530/article/details/144113722

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!