【Qt】输入类控件QLineEdit

目录

输入类控件QLineEdit

例子:录入个人信息

例子:使用正则表达式验证输入框的数据

例子:验证俩次输入密码一致

例子:切换显示代码


输入类控件QLineEdit

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

核心属性

属性 说明
text 输⼊框中的⽂本
inputMask 输⼊内容格式约束
maxLength 最⼤⻓度
frame 是否添加边框
echoMode 显⽰⽅式. * QLineEdit::Normal :这是默认值,⽂本框会显⽰输⼊的⽂本。 * QLineEdit::Password :在这种模式下,输⼊的字符会被隐藏,通常⽤星号(*)或等号(=)代替。 * QLineEdit::NoEcho :在这种模式下,⽂本框不会显⽰任何输⼊的字符。
cursorPosition 光标所在位置
alignment ⽂字对⻬⽅式, 设置⽔平和垂直⽅向的对⻬.
dragEnabled 是否允许拖拽
readOnly 是否是只读的(不允许修改)
placeHolderText 当输⼊框内容为空的时候, 显⽰什么样的提⽰信息
clearButtonEnabled 是否会⾃动显⽰出 "清除按钮".

text属性,不仅仅可以通过代码来设置,用户在输入框中进行编辑,也会影响到text值的变化

(1)通过代码中设置text,界面上的文本会发生变化

(2) 直接操作修改界面上的文本(输入框、可以编辑的),text属性的值也会发生改变。
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)密码

(3)性别

(4)电话

通过提交按钮,把上述内容给统一获取到

使用Qt Designer进行初步设计,并修改objectName

cpp 复制代码
#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都是验证成功。

此时就需要"正则表达式"
"正则表达式"式计算机中的通用概念,和具体的编程语言无关。

正则表达式,本质上就是一个带有特殊字符的字符串,特殊字符用来表示另一个字符串的特征,此时就可以借助正则表达式来描述一些具有一定特定的字符串。

基于这些特点,就可以完成字符串的匹配。

正则表达式文档:

正则表达式语法https://learn.microsoft.com/zh-cn/previous-versions/visualstudio/visual-studio-2008/ae5bf541(v=vs.90)?redirectedfrom=MSDN正则表达式测试工具:

正则表达式测试工具https://regextester.buyaocha.com/

此处的规则是:输入框要检查输入的内容是否是合法的手机号码。

如果是,则按钮设置为可用状态。

如果不是,则设置为禁用状态。

(1)在界面上设置一个输入框和按钮

(2)将按钮初始enabled设置成false

(3)给输入框设置验证器

使⽤ QRegExpValidator 创建⼀个验证器对象. Qt 中内置了四个主要的验证器对象

"^1\\d{d}$"

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

^ 表示以XXX开头。

^ 后面紧跟着数字1,意思就是以1开头。

\d 表示数字,为了在C++字符串中使用,需要写作 \\d

{10}表示前面的内容重复出现了10次,\d数字要重复出现10次。

$ 表示结尾。

这里只是注册了一个验证器,下面还需要编写代码进行验证器的使用。

(4)给 lineEdit 添加 textEdited 信号的 slot 函数

  • on_lineEdit_textEdited 的参数是当前输⼊框的内容.

  • 通过 lineEdit->validator() 获取到内置的验证器.

  • 通过 validate ⽅法验证⽂本是否符合要求

  • 第一个参数,是要验证的字符串,参数类型是QString&,不是const,需要将这个变量复制。
  • 第⼆个参数是⼀个 int&, 是输出型参数. 当验证的字符串不匹配时, 返回这个字符串的⻓度. (没有什么实质作⽤).{在这段代码中,pos 在这里通常被设置为 0 是因为你想要从输入内容的起始位置开始进行验证。}
  • 返回值是⼀个枚举. QValidator::Acceptable 表⽰验证通过, QValidator::Invalid 表⽰验证不通过.
cpp 复制代码
#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信号,来触发对于俩个输入框内容的判定。

接下来,结合之前的知识,来一次整合!!!

(1)设置俩个输入框,三个文本框

(2)编写代码

cpp 复制代码
#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;

这个写法就是类型转换,这个写法对于代码的实际逻辑是没有任何影响的,可以骗过编译器。

例子:切换显示代码

代码展示:

cpp 复制代码
#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));
    }
}
相关推荐
我叫珂蛋儿吖20 分钟前
[redis进阶六]详解redis作为缓存&&分布式锁
运维·c语言·数据库·c++·redis·分布式·缓存
9527华安22 分钟前
紫光同创FPGA实现AD7606数据采集转UDP网络传输,提供PDS工程源码和技术支持和QT上位机
网络·qt·fpga开发·udp·紫光同创·ad7606
来自星星的坤25 分钟前
深入理解 NumPy:Python 科学计算的基石
开发语言·python·numpy
小声读源码1 小时前
【技巧】使用UV创建python项目的开发环境
开发语言·python·uv·dify
yxc_inspire1 小时前
基于Qt的app开发第七天
开发语言·c++·qt·app
zm-v-159304339861 小时前
解锁遥感数据密码:DeepSeek、Python 与 OpenCV 的协同之力
开发语言·python·opencv
周Echo周1 小时前
20、map和set、unordered_map、un_ordered_set的复现
c语言·开发语言·数据结构·c++·算法·leetcode·list
明天更新1 小时前
Java处理压缩文件的两种方式!!!!
java·开发语言·7-zip
老胖闲聊1 小时前
C# 注册表操作类
开发语言·c#
勘察加熊人1 小时前
Python+Streamlit实现登录页
开发语言·python