深入浅出之QLineEdit

一、特点

QLineEdit是Qt库中一个轻量级的单行文本编辑器控件,它的主要特点包括:

  1. 轻量级:占用的系统资源较少,可以轻松集成到各种应用程序中。
  2. 易用性:使用方法简单明了,开发人员可以很容易地将其添加到应用程序中并对其进行配置。
  3. 支持多种输入模式:可以根据不同的回显模式显示不同的输入内容,例如密码模式或隐藏输入模式,增加了在处理敏感信息时的安全性。
  4. 输入限制和验证:通过设置输入掩码和验证器,可以限制用户输入的内容类型,并进行有效性检查,确保用户输入的数据符合预期格式和要求。
  5. 可交互性:支持添加动作和清除按钮,增加了用户与输入框的交互性。
  6. 外观可定制:通过设置字体、样式表等属性,可以定制QLineEdit的外观,以适应不同的应用程序风格和用户需求。
  7. 事件响应:可以使用信号和槽机制来响应用户的输入事件,例如文本改变、编辑完成等,使开发人员能够在用户输入时执行相应的操作或触发其他事件。

二、常用函数

QLineEdit的常用函数包括:

  1. setText(const QString &text):设置行编辑框的文本内容。
  2. text() const:返回行编辑框的当前文本内容。
  3. setEchoMode(QLineEdit::EchoMode mode):设置文本的回显模式,例如正常显示、密码模式等。
  4. setAlignment(Qt::Alignment flag):设置文本的对齐方式。
  5. setValidator(const QValidator *validator):设置一个验证器来限制用户的输入。
  6. setPlaceholderText(const QString &text):设置占位符文本,当行编辑框为空时显示。
  7. setCursorPosition(int position):设置光标位置。
  8. setSelection(int start, int length):选择从start开始的长度为length的文本。
  9. setReadOnly(bool):设置行编辑框为只读模式。
  10. setMaxLength(int):设置文本的最大长度。
  11. setCompleter(QCompleter *completer):设置一个补全器,用于在用户输入时提供自动补全建议。

下面以表格形式展现 

方法

描述

QMessageBox::information()

显示信息框,包含图标、标题和文本信息。

QMessageBox::warning()

显示警告框,包含图标、标题和警告文本。

QMessageBox::critical()

显示错误框,包含图标、标题和错误文本。

QMessageBox::question()

显示提问框,包含图标、标题和问题文本,通常有"是"、"否"按钮。

QMessageBox::about()

显示关于框,包含图标、标题和关于文本。

QMessageBox::aboutQt()

显示关于Qt框,包含图标、标题和关于Qt文本。

QMessageBox::setWindowTitle()

设置消息框的标题。

QMessageBox::setText()

设置消息框的主要文本。

QMessageBox::setInformativeText()

设置消息框的附加信息。

QMessageBox::setIcon()

设置消息框的图标类型。

QMessageBox::setStandardButtons()

设置消息框的标准按钮集合,如确定、取消等。

QMessageBox::setDefaultButton()

设置消息框中默认的按钮,按下 Enter 键会触发默认按钮。

QMessageBox::exec()

执行消息框并等待用户的响应,返回用户选择的按钮。

QMessageBox::button()

获取消息框中指定类型的按钮,用于自定义按钮的属性和行为。

QMessageBox::addButton()

向消息框添加自定义按钮。

QMessageBox::removeButton()

从消息框移除自定义按钮。

QMessageBox::setDefaultButton()

设置默认按钮,按下 Enter 键触发默认按钮。

三、优缺点

优点

  1. 简单易用,适合快速开发。
  2. 功能丰富,支持多种输入模式和验证方式。
  3. 外观可定制,满足不同的应用需求。

缺点

  1. 相比QTextEdit等控件,功能较为单一,只支持单行文本输入。
  2. 在处理大量文本输入时,可能不如QTextEdit等控件方便。

四、QLineEdit和TextEdit的区别

QLineEdit和TextEdit都是Qt框架中用于文本输入的控件,但它们之间存在显著的区别。以下是对这两个控件的详细比较:

4.1、功能差异

  1. QLineEdit
    • 这是一个单行文本输入框,只允许用户输入和编辑单行文本。
    • 提供了丰富的编辑功能,如撤销、重做、剪切、粘贴和拖放等。
    • 支持多种输入模式,如正常模式、密码模式(隐藏输入内容,以小圆圈代替)等。
    • 可以通过设置输入掩码和验证器来限制用户输入的内容类型,并进行有效性检查。
  2. TextEdit
    • 这是一个多行文本输入框,允许用户输入和编辑多行文本。
    • 除了基本的文本编辑功能外,还支持富文本编辑,如设置字体、颜色、对齐方式等样式。
    • 可以插入和显示图片、表格等多媒体内容。
    • 通常用于需要输入和显示大量文本内容的场合,如文章编辑器、邮件编辑器等。

4.2、外观差异

  1. QLineEdit
    • 输入框通常呈现为一条灰色边框,外观简洁明了。
    • 宽度根据输入的文本自动调整,高度固定为单行文本的高度。
  2. TextEdit
    • 输入框通常呈现为一个矩形接收器,可以设置不同的边框样式和背景颜色。
    • 有一个可以设置的固定宽度和高度,用于容纳多行文本内容。
    • 外观更具美感,可以通过设置样式表等属性进行定制。

4.3、使用场景

  1. QLineEdit
    • 适用于需要用户输入少量文本内容的场合,如用户名、密码、搜索框等。
    • 由于其单行输入的特性,更适合用于简单的输入项和表单中。
  2. TextEdit
    • 适用于需要用户输入和显示大量文本内容的场合,如文章编辑器、邮件编辑器、聊天窗口等。
    • 由于其支持富文本编辑和多媒体内容插入的特性,更适合用于需要复杂文本处理的场合。

综上所述,QLineEdit和TextEdit在功能、外观和使用场景方面存在显著差异。开发人员应根据具体需求选择合适的控件来构建用户界面。

五、QLineEdit实现密码

在Qt中,QLineEdit控件可以用来实现密码输入框。为了将QLineEdit配置为密码输入框,你需要设置其回显模式(EchoMode)为QLineEdit::PasswordQLineEdit::PasswordEchoOnEdit

  • QLineEdit::Password:这是标准的密码模式,输入的每个字符都会被一个小圆点(●)或星号(*)替换,具体取决于操作系统和Qt的样式。
  • QLineEdit::PasswordEchoOnEdit:在这个模式下,当输入框为空时,不显示任何字符;一旦开始输入,字符会被回显为小圆点或星号,但如果输入框再次变为空(例如,通过删除所有字符),则不会显示任何内容。

以下是一个简单的例子,展示了如何使用QLineEdit来创建一个密码输入框:

#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QLineEdit>
#include <QLabel>
#include <QPushButton>
#include <QMessageBox>

class PasswordDialog : public QWidget {
    Q_OBJECT

public:
    PasswordDialog(QWidget *parent = nullptr) : QWidget(parent) {
        QVBoxLayout *layout = new QVBoxLayout(this);

        QLabel *label = new QLabel("请输入密码:", this);
        layout->addWidget(label);

        passwordEdit = new QLineEdit(this);
        passwordEdit->setEchoMode(QLineEdit::Password); // 设置密码模式
        layout->addWidget(passwordEdit);

        QPushButton *submitButton = new QPushButton("提交", this);
        layout->addWidget(submitButton);

        connect(submitButton, &QPushButton::clicked, this, &PasswordDialog::onSubmit);
    }

private slots:
    void onSubmit() {
        QString password = passwordEdit->text();
        // 在这里处理密码,例如验证或提交到服务器
        QMessageBox::information(this, "密码", "你输入的密码是:" + password); // 仅用于演示,实际中不应显示密码
    }

private:
    QLineEdit *passwordEdit;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    PasswordDialog dialog;
    dialog.show();

    return app.exec();
}

#include "main.moc" // 如果你使用的是qmake,并且没有单独的.cpp和.h文件,则需要这一行来包含自动生成的MOC代码

注意

  1. 在上面的代码中,我使用了QMessageBox::information来显示用户输入的密码,但这仅用于演示目的。在实际应用中,你永远不应该以明文形式显示用户输入的密码。
  2. 为了安全起见,你应该在提交密码之前对其进行验证,并确保它符合你的安全策略(例如,长度、复杂性等)。
  3. 在生产环境中,密码应该通过安全的方式(如HTTPS)发送到服务器,并且不应该在客户端以明文形式存储或处理。
  4. 如果你使用的是Qt Creator或类似的IDE,并且你的代码分布在多个文件中(例如,.h头文件和.cpp源文件),则不需要包含#include "main.moc"这一行。MOC(Meta-Object Compiler)会自动为你的类生成必要的元对象代码。但是,如果你将所有代码都放在一个.cpp文件中,并且没有使用qmake或CMake等构建系统来自动生成MOC代码,你可能需要手动包含生成的MOC代码(尽管这通常不是推荐的做法)。在上面的示例中,我包含了这一行是为了确保在简单的一文件项目中也能正常工作,但这通常不是实际开发中的做法。

 六、QLineEdit使用setValidator校验

在Qt中,QLineEdit 提供了一个名为 setValidator 的方法,允许你为输入框设置一个验证器(QValidator 或其子类)。验证器用于在用户输入文本时检查输入的有效性,并根据验证结果接受或拒绝输入。

QValidator 有两个主要的子类:

  1. QIntValidator:用于检查输入是否为整数。你可以指定输入的最小值和最大值。
  2. QDoubleValidator:用于检查输入是否为浮点数(双精度)。同样,你可以指定输入的最小值和最大值,以及有效的小数位数。
  3. QRegExpValidator:使用正则表达式来检查输入是否符合特定的模式。

以下是如何为 QLineEdit 设置验证器的一个简单示例:

#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QLineEdit>
#include <QIntValidator>
#include <QLabel>
#include <QMessageBox>

class InputDialog : public QWidget {
    Q_OBJECT

public:
    InputDialog(QWidget *parent = nullptr) : QWidget(parent) {
        QVBoxLayout *layout = new QVBoxLayout(this);

        QLabel *label = new QLabel("请输入一个整数:", this);
        layout->addWidget(label);

        lineEdit = new QLineEdit(this);

        // 创建一个 QIntValidator 对象,设置允许的最小值和最大值
        QIntValidator *validator = new QIntValidator(10, 100, this);

        // 将验证器设置到 QLineEdit 上
        lineEdit->setValidator(validator);

        layout->addWidget(lineEdit);

        QPushButton *submitButton = new QPushButton("提交", this);
        layout->addWidget(submitButton);

        connect(submitButton, &QPushButton::clicked, this, &InputDialog::onSubmit);
    }

private slots:
    void onSubmit() {
        // 检查输入是否有效
        if (lineEdit->hasAcceptableInput()) {
            bool ok;
            int value = lineEdit->text().toInt(&ok);
            if (ok) {
                QMessageBox::information(this, "输入有效", "你输入的整数是:" + QString::number(value));
            } else {
                // 这通常不会发生,因为我们已经通过验证器检查了输入
                QMessageBox::warning(this, "错误", "无法将输入转换为整数。");
            }
        } else {
            QMessageBox::warning(this, "输入无效", "请输入一个有效的整数(10-100之间)。");
        }
    }

private:
    QLineEdit *lineEdit;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    InputDialog dialog;
    dialog.show();

    return app.exec();
}

#include "main.moc" // 如果你的代码在一个文件中,并且你使用的是qmake,则需要这一行

在这个示例中,我们创建了一个 QIntValidator 对象,它限制用户只能输入10到100之间的整数。然后,我们将这个验证器设置到 QLineEdit 上。当用户点击“提交”按钮时,我们检查输入是否有效,并显示一个消息框来告知用户结果。

请注意,hasAcceptableInput() 方法用于检查当前输入是否通过验证器的验证。如果输入无效,QLineEdit 通常会显示一个红色的边框来提示用户。你也可以通过调用 QLineEdit 的 setInputMethodHints 方法来进一步定制输入提示和验证行为。

 七、QLineEdit使用正则表达式

在Qt中,你可以使用QRegExpValidator类结合正则表达式来检查QLineEdit中的输入是否符合特定的模式。QRegExpValidatorQValidator的一个子类,它使用QRegExp(在Qt 5及更早版本中)或QRegularExpression(从Qt 5.5开始引入,推荐在新代码中使用)来定义验证规则。

以下是一个使用QRegularExpressionValidator来检查输入的示例:

#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QLineEdit>
#include <QRegularExpressionValidator>
#include <QLabel>
#include <QMessageBox>

class RegExpInputDialog : public QWidget {
    Q_OBJECT

public:
    RegExpInputDialog(QWidget *parent = nullptr) : QWidget(parent) {
        QVBoxLayout *layout = new QVBoxLayout(this);

        QLabel *label = new QLabel("请输入符合以下模式的文本:^[a-zA-Z0-9_]+$", this);
        // 上面的正则表达式意味着输入只能包含字母、数字和下划线
        layout->addWidget(label);

        lineEdit = new QLineEdit(this);

        // 创建一个 QRegularExpressionValidator 对象,并设置正则表达式
        QRegularExpressionValidator *validator = new QRegularExpressionValidator(QRegularExpression("^[a-zA-Z0-9_]+$"), this);

        // 将验证器设置到 QLineEdit 上
        lineEdit->setValidator(validator);

        layout->addWidget(lineEdit);

        QPushButton *submitButton = new QPushButton("提交", this);
        layout->addWidget(submitButton);

        connect(submitButton, &QPushButton::clicked, this, &RegExpInputDialog::onSubmit);
    }

private slots:
    void onSubmit() {
        // 检查输入是否有效
        if (lineEdit->hasAcceptableInput()) {
            QString value = lineEdit->text();
            QMessageBox::information(this, "输入有效", "你输入的文本是:" + value);
        } else {
            QMessageBox::warning(this, "输入无效", "请输入符合模式的文本(只能包含字母、数字和下划线)。");
        }
    }

private:
    QLineEdit *lineEdit;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    RegExpInputDialog dialog;
    dialog.show();

    return app.exec();
}

#include "main.moc" // 如果你的代码在一个文件中,使用qmake构建,则需要这一行

在这个示例中,我们创建了一个QRegularExpressionValidator对象,并传入了一个正则表达式^[a-zA-Z0-9_]+$。这个正则表达式意味着输入字符串只能包含字母(大小写均可)、数字和下划线,并且至少包含一个字符(由于+的使用)。然后,我们将这个验证器设置到了QLineEdit上。

当用户输入文本并点击“提交”按钮时,hasAcceptableInput()方法会被调用以检查输入是否符合正则表达式定义的模式。如果输入有效,会显示一个信息框;如果无效,则显示一个警告框。

请注意,从Qt 5.5开始,推荐使用QRegularExpressionQRegularExpressionValidator,因为它们提供了更强大和灵活的正则表达式支持,相比QRegExpQRegExpValidator。如果你正在使用Qt 5或更早的版本,并且需要正则表达式支持,你应该使用QRegExpQRegExpValidator,但请注意它们的正则表达式语法和功能可能不如QRegularExpression那么强大。

 八、示例

要使用QLineEdit,首先需要在项目中包含相应的头文件,并在CMakeLists.txt文件中添加对Qt Widgets模块的依赖。然后,可以在代码中创建QLineEdit对象,并设置其属性、连接信号和槽等。

例如:

#include <QLineEdit>
#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout(&window);

    QLineEdit *lineEdit = new QLineEdit(&window);
    lineEdit->setPlaceholderText("请输入内容");
    lineEdit->setMaxLength(32);
    lineEdit->setEchoMode(QLineEdit::Normal); // 可以设置为其他回显模式,如密码模式等

    // 连接信号和槽
    QObject::connect(lineEdit, &QLineEdit::textChanged, [](const QString &text) {
        qDebug() << "Text changed to:" << text;
    });

    layout->addWidget(lineEdit);
    window.setLayout(layout);
    window.show();

    return app.exec();
}

在这个例子中,我们创建了一个QLineEdit对象,并设置了占位符文本、最大长度和回显模式。然后,我们连接了textChanged信号到一个lambda函数,当文本内容改变时,该函数会被调用并输出新的文本内容。最后,我们将QLineEdit对象添加到布局中,并显示窗口。

参考:

  1. C++ Qt开发:LineEdit单行输入组件-腾讯云开发者社区-腾讯云
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩瀚之水_csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值