Qt 常用控件 - 6
摘要:本文介绍了Qt中常用的输入控件QCalendarWidget和QLineEdit的使用方法。QCalendarWidget提供了丰富的日期选择功能,包括日期范围设置、显示格式调整等核心属性,以及selectionChanged等信号。QLineEdit作为单行文本输入框,支持多种输入模式、格式验证和显示控制,如密码输入、正则表达式验证等。文章通过多个代码示例详细展示了如何实现日期选择、密码输

Qt 常用控件 - 5
https://blog.csdn.net/Small_entreprene/article/details/149878396?spm=1001.2014.3001.5501
Calendar Widget
QCalendarWidget 表示一个"日历"控件。

核心属性
| 属性 | 说明 |
|---|---|
| selectDate | 当前选中的日期 |
| minimumDate | 最小日期(默认不动) |
| maximumDate | 最大日期(默认不动) |
| firstDayOfWeek | 每周的第一天(也就是日历的第一列)是周几 |
| gridVisible | 是否显示表格的边框 |
| selectionMode | 是否允许多选日期 |
| navigationBarVisible | 日历上方标题是否显示 |
| horizontalHeaderFormat | 日历上方标题显示的日期格式 |
| verticalHeaderFormat | 日历第一列显示的内容格式 |
| dateEditEnabled | 是否允许日期被编辑 |
horizontal --- h --- 水平
vertical --- v --- 垂直
核心信号
-
selectionChanged(const QDate&):当选中的日期发生改变时,发出这个信号 -
activated(const QDate&):当双击一个有效的日期或者按下回车键时发出,形参是一个QDate类型,保存了选中的日期 -
currentPageChanged(int, int):当年份月份改变时发出,形参表示改变后的新年份和月份
代码示例:获取选中的日期
在界面上创建一个 QCalendarWidget 和一个 label,objectName 分别为 calendarWidget 和 TextLabel:

为 QCalendarWidget 添加 slot 函数:
void Widget::on_calendarwidget_selectionChanged()
{
QDate date = ui->calendarWidget->selectedDate();
qDebug() << date;
ui->label->setText(date.toString());
}
执行程序,可以看到当选择不同的日期时,label 中的内容就会随之改变。

我们显示类控件的介绍就基本结束啦,接下来,就是输入类控件了!
输入类控件
Line Edit
QLineEdit 用来表示单行输入框,可以输入一段文本,但是不能换行。
核心属性
| 属性 | 说明 |
|---|---|
| text |
输入框中的文本: (1)通过代码中设置 text,界面上的文本会发生变化 (2)直接操作写该界面上的文本(输入框,可编辑),text 的属性也会发生变化 |
| inputMask | 输入内容格式约束 |
| maxLength | 最大长度 |
| frame | 是否添加边框 |
| echoMode | 显示方式: - QLineEdit::Normal:默认值,显示输入的文本- QLineEdit::Password:输入的字符会被隐藏,通常用星号(*)或等号(=)代替- QLineEdit::NoEcho:不显示任何输入的字符 |
| cursorPosition | 光标所在位置 |
| alignment | 文字对齐方式,设置水平和垂直方向的对齐 |
| dragEnabled | 是否允许拖拽 |
| readOnly | 是否是只读的(不允许修改) |
| placeHolderText | 当输入框内容为空的时候显示的提示信息 |
| clearButtonEnabled | 是否会自动显示出"清除按钮" |
核心信号
| 信号 | 说明 |
|---|---|
cursorPositionChanged(int old, int new) |
当鼠标移动时发出此信号 |
editingFinished() |
当按返回或者回车键时,或者行编辑失去焦点时发出 |
returnPressed() |
当返回或回车键按下时发出,如果设置了验证器,必须要验证通过才能触发 |
selectionChanged() |
当选中的文本改变时发出 |
textChanged(const QString &text) |
当QLineEdit中的文本改变时发出,text是新的文本,代码对文本的修改能够触发这个信号 |
textEdited(const QString &text) |
当QLineEdit中的文本改变时发出,text是新的文本,代码对文本的修改不能触发这个信号 |
代码示例:录入个人信息
在界面上创建(4个label)三个输入框和两个单选按钮,一个普通按钮:
三个输入框的 objectName 为 LineEdit_name,LineEdit_password,LineEdit_phone
两个单选按钮的 objectName 为 radioButton_male,radioButton_female
按钮的 objectName 为 pushButton

编写 widget.cpp,在构造函数中编写初始化代码:
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_password->setClearButtonEnabled(true);
// 将显示格式设置成显示密码的模式
ui->lineEdit_password->setEchoMode(QLineEdit::Password);
// 初始化第三个输入框,用来输入电话
ui->lineEdit_phone->setPlaceholderText("请输入电话号码");
ui->lineEdit_phone->setClearButtonEnabled(true);
// 手机号码是有固定格式的,此处的0,代表数字
ui->lineEdit_phone->setInputMask("000-0000-0000");
}
为按钮添加 slot 函数:
void Widget::on_pushButton_clicked()
{
QString gender = ui->radioButton_male->isChecked() ? "男" : "女";
qDebug() << "姓名: " << ui->LineEdit_name->text()
<< "密码: " << ui->LineEdit_password->text()
<< "性别: " << gender
<< "手机: " << ui->LineEdit_phone->text();
}
执行程序,可以看到随着用户输入内容之后,点击按钮,就能打印输入的信息。此处我们只是进行简单打印,实际开发中可以通过网络把数据发给服务器!

inputMask 功能比较有限,只能进行简单的验证,这时候我们就需要使用正则表达式 --- 本质上就是一个带有特殊符号的字符串,特殊字符串用来表示另一个字符串的特征!此时就可以借助正则表达式来描述一些具有一定特点的字符串!(以什么开头/结尾,重复穿出现几次....)基于这些特点,就可以完成字符串的匹配!
正则表达式是一种在计算机中常用的,使用特殊字符描述一个字符串的特征的机制。在进行字符串匹配时非常有用。
正则表达式的语法还比较复杂,一般都是随用随查,不需要背下来。
参考:
正则表达式文档:正则表达式语法 | Microsoft Learn
正则表达式在线工具:正则表达式语法测试工具 - 在线工具
代码示例:使用正则表达式验证输入框的数据
要求:在输入框中输入一个合法的电话号码(1开头,11位,全都是数字)。如果验证不通过,则确定按钮无法点击。
在界面上创建输入框和一个按钮。

编写 widget.cpp,把按钮初始 enabled 设为 false,给输入框添加验证器:
使用 QRegularExpressionValidator 创建一个验证器对象。Qt 中内置了四个主要的验证器对象:

QRegularExpressionValidator 在匹配性能上做出了一定优化,但是从使用角度讲,和 QRegExpValidator 差别不大。
#include "widget.h"
#include "ui_widget.h"
#include <QRegularExpressionValidator>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 就需要给单行输入框设置验证器,基于正则表达式来完成验证的!
QRegularExpression regExp("^1\\d{10}$");
ui->lineEdit->setValidator(new QRegularExpressionValidator(regExp));
}
给 lineEdit 添加 textEdited 信号的 slot 函数:
on_lineEdit_textEdited 的参数是当前输入框的内容
通过 lineEdit->validator() 获取到内置的验证器
通过 validate 方法验证文本是否符合要求
- 第一个参数填写的是要验证的字符串。由于参数要求是 QString& 而不是 const QString&,需要把这个变量复制一下
- 第二个参数是一个 int&,是输出型参数。当验证的字符串不匹配时,返回这个字符串的长度(没有什么实质作用)
void Widget::on_lineEdit_textEdited(const QString &text)
{
QString content = text;
int pos = 0;
if(ui->lineEdit->validator()->validate(content, pos) == QValidator::Acceptable)
{
// 验证通过
ui->pushButton->setEnabled(true);
}
else
{
ui->pushButton->setEnabled(false);
}
}
执行程序,观察效果。可以看到此时尝试输入字母是无法输入的,并且只有当输入的内容符合要求,确定按钮才能被使用。

代码示例:验证两次输入的密码一致
在界面上创建两个输入框和一个 label

编写代码,设置两个输入框的 echoMode 为 Password:
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 初始化,把这两个的输入框的 echoMode 设置一下
ui->lineEdit->setEchoMode(QLineEdit::Password);
ui->lineEdit_2->setEchoMode(QLineEdit::Password);
ui->label->setText("密码为空");
}
给两个输入框设置 textEdited slot 函数:
void Widget::on_lineEdit_textEdited(const QString &arg1)
{
(void)arg1;
this->compare();
}
void Widget::on_lineEdit_2_textEdited(const QString &arg1)
{
(void)arg1;
this->compare();
}
void Widget::compare()
{
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("两次输入的密码不一致");
}
}
执行程序,观察效果。可以看到当两个输入框内的密码相同时,就会提示密码相同。

代码示例:切换显示密码
创建一个输入框和一个复选按钮
修改 widget.cpp,设置输入框的 echoMode 为 Password:
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->LineEdit->setEchoMode(QLineEdit::Password);
}
为 checkBox 添加 slot 函数:
void Widget::on_checkBox_toggled(bool checked)
{
if (checked) {
ui->LineEdit->setEchoMode(QLineEdit::Normal);
} else {
ui->LineEdit->setEchoMode(QLineEdit::Password);
}
}
执行程序,可以看到切换复选框的状态,就可以控制输入框显示密码

更多推荐


所有评论(0)