Qt框架中QLineEdit控件的使用详解
Qt框架中QLineEdit控件的使用详解
Qt框架中的QLineEdit控件是用于单行文本输入的基本控件,广泛应用于各种用户界面设计中。本文将详细介绍QLineEdit的核心属性和信号,并通过四个具体实例展示其在实际开发中的应用,包括个人信息录入、正则表达式验证、密码一致性验证以及显示模式切换等功能。
输入类控件QLineEdit
QLineEdit 用来表示单行输入框,可以输入一段文本,但是不能换行。以下是QLineEdit的一些核心属性:
属性 | 说明 |
---|---|
text | 输入框中的文本 |
inputMask | 输入内容格式约束 |
maxLength | 最大长度 |
frame | 是否添加边框 |
echoMode | 显示方式。QLineEdit::Normal:这是默认值,文本框会显示输入的文本。QLineEdit::Password:在这种模式下,输入的字符会被隐藏,通常用星号(*)或等号(=)代替。QLineEdit::NoEcho:在这种模式下,文本框不会显示任何输入的字符。 |
cursorPosition | 光标所在位置 |
alignment | 文字对齐方式,设置水平和垂直方向的对齐。 |
dragEnabled | 是否允许拖拽 |
readOnly | 是否是只读的(不允许修改) |
placeHolderText | 当输入框内容为空的时候,显示什么样的提示信息 |
clearButtonEnabled | 是否会自动显示“清除按钮”。 |
text属性,不仅仅可以通过代码来设置,用户在输入框中进行编辑,也会影响到text值的变化:
- 通过代码中设置text,界面上的文本会发生变化
- 直接操作修改界面上的文本(输入框、可以编辑的),text属性的值也会发生改变。
placeHolderText可以起到“提示作用”:
- 当输入框为空的时候,没有任何内容的时候,提示信息才会存在。
- 一旦用户在这里进行任何动作输入,这个提示信息就会消失。
clearButtonEnabled可以显示清空按钮!
- 如果输入框为空,此时没有任何显示。
- 当输入框有内容的时候,右侧就会出现一个类似于删除的按钮,点击按钮就会立即将输入框里面的内容清空。
以下是QLineEdit的核心信号:
信号 | 说明 |
---|---|
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是新的文本。代码对文本的修改不能触发这个信号。 |
例子:录入个人信息
让用户输入信息:
- 姓名
- 密码
- 性别
- 电话
通过提交按钮,把上述内容给统一获取到。使用Qt Designer进行初步设计,并修改objectName。
#include "widget.h"
#include "ui_widget.h"
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_telephone->setPlaceholderText("请输入电话号码");
ui->lineEdit_telephone->setClearButtonEnabled(true);
ui->lineEdit_telephone->setInputMask("00000000000");
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
QString gender = ui->radioButton_male->isChecked() ? "男" : "女";
ui->label_information->setText("姓名:" + ui->lineEdit_name->text() + "\n"
"密码:" + ui->lineEdit_password->text() + "\n"
"性别:" + gender + "\n"
"电话号码:" + ui->lineEdit_telephone->text() + "\n");
}
例子:使用正则表达式验证输入框的数据
在上一个例子中,验证电话号码的方式是使用inputMask,其功能比较有限,只能进行简单的验证,假设你输入:9999999999都是验证成功。此时就需要“正则表达式”。
“正则表达式”是计算机中的通用概念,和具体的编程语言无关。正则表达式,本质上就是一个带有特殊字符的字符串,特殊字符用来表示另一个字符串的特征,此时就可以借助正则表达式来描述一些具有一定特定的字符串。基于这些特点,就可以完成字符串的匹配。
正则表达式文档:
正则表达式语法
正则表达式测试工具:
正则表达式测试工具
此处的规则是:输入框要检查输入的内容是否是合法的手机号码。如果是,则按钮设置为可用状态。如果不是,则设置为禁用状态。
- 在界面上设置一个输入框和按钮
- 将按钮初始enabled设置成false
- 给输入框设置验证器
使⽤ QRegExpValidator 创建⼀个验证器对象. Qt 中内置了四个主要的验证器对象
"^1\d{d}$"
这是一段简单的验证手机号码的正则表达式。
^ 表示以XXX开头。
^ 后面紧跟着数字1,意思就是以1开头。
\d 表示数字,为了在C++字符串中使用,需要写作 \d
{10}表示前面的内容重复出现了10次,\d数字要重复出现10次。
$
表示结尾。
这里只是注册了一个验证器,下面还需要编写代码进行验证器的使用。
- 给 lineEdit 添加 textEdited 信号的 slot 函数
- on_lineEdit_textEdited 的参数是当前输入框的内容.
- 通过 lineEdit->validator() 获取到内置的验证器.
- 通过 validate 方法验证文本是否符合要求
- 第一个参数,是要验证的字符串,参数类型是QString&,不是const,需要将这个变量复制。
- 第二个参数是⼀个 int&, 是输出型参数. 当验证的字符串不匹配时, 返回这个字符串的长度. (没有什么实质作用).
- 返回值是⼀个枚举. QValidator::Acceptable 表⽰验证通过, QValidator::Invalid 表⽰验证不通过.
#include "widget.h"
#include "ui_widget.h"
#include<QRegExpValidator>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//将按钮初始enabled设置为false
ui->pushButton->setEnabled(false);
//基于正则表达式进行验证
QRegExp regExp("^1\\d{10}$");
//给单行输入框设置验证器
ui->lineEdit->setValidator(new QRegExpValidator(regExp));
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_lineEdit_textEdited(const QString &arg1)
{
QString content = arg1;
int pos = 0;
if(ui->lineEdit->validator()->validate(content, pos) == QValidator::Acceptable)
{
//验证通过
ui->pushButton->setEnabled(true);
}
else
{
//验证不通过
ui->pushButton->setEnabled(false);
}
}
例子:验证俩次输入密码一致
使用textEdited信号,来触发对于俩个输入框内容的判定。接下来,结合之前的知识,来一次整合!!!
- 设置俩个输入框,三个文本框
- 编写代码
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//设置最上面的文本
ui->label_1->setText("请设置密码:");
//初始化第一个输入框
ui->lineEdit_1->setPlaceholderText("请输入新密码");
ui->lineEdit_1->setEchoMode(QLineEdit::Password);
ui->lineEdit_1->setClearButtonEnabled(true);
//设置第二个文本为空
ui->label_2->setText(" ");
//设置第二个输入框
ui->lineEdit_2->setPlaceholderText("验证新密码");
ui->lineEdit_2->setEchoMode(QLineEdit::Password);
ui->lineEdit_2->setClearButtonEnabled(true);
//设置迪桑文本为空
ui->label_3->setText(" ");
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_lineEdit_1_textEdited(const QString &arg1)
{
(void) arg1;
QString s1 = ui->lineEdit_1->text();
QString s2 = ui->lineEdit_2->text();
if(!s1.isEmpty())
{
ui->label_2->setText("密码正确");
ui->label_2->setStyleSheet("color: green;");
}
}
void Widget::on_lineEdit_2_textEdited(const QString &arg1)
{
(void) arg1;
QString s1 = ui->lineEdit_1->text();
QString s2 = ui->lineEdit_2->text();
if(!s2.isEmpty())
{
if(s1 == s2)
{
ui->label_3->setText("密码正确");
ui->label_3->setStyleSheet("color: green;");
}
else
{
ui->label_3->setText("密码错误");
ui->label_3->setStyleSheet("color: red;");
}
}
}
上述例子中,俩次的参数都没有使用。但是编译器在检查的时候会提出警告,所以可以将在函数内部写出:
(void) arg1;
这个写法就是类型转换,这个写法对于代码的实际逻辑是没有任何影响的,可以骗过编译器。
例子:切换显示代码
代码展示:
#include "widget.h"
#include "ui_widget.h"
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)
{
if(checked)
{
//true,表示需要显示密码
ui->lineEdit->setEchoMode(QLineEdit::Normal);
}
else
{
//false,表示需要隐藏密码
ui->lineEdit->setEchoMode((QLineEdit::Password));
}
}