Qt——QLineEdit使用总结

QLineEdit是一个单行文本编辑控件。

使用者可以通过很多函数,输入和编辑单行文本,比如撤销、恢复、剪切、粘贴以及拖放等。

通过改变QLineEdit的 echoMode() ,可以设置其属性,比如以密码的形式输入。

文本的长度可以由 maxLength() 限制,可以通过使用 validator() 或者 inputMask() 可以限制它只能输入数字。在对同一个QLineEdit的validator或者input mask进行转换时,最好先将它的validator或者input mask清除,以避免错误发生。

与QLineEdit相关的一个类是QTextEdit,它允许多行文字以及富文本编辑。

我们可以使用 setText() 或者 insert() 改变其中的文本,通过 text() 获得文本,通过 displayText() 获得显示的文本,使用 setSelection() 或者 selectAll() 选中文本,选中的文本可以通过cut()、copy()、paste()进行剪切、复制和粘贴,使用 setAlignment() 设置文本的位置。

文本改变时会发出 textChanged() 信号;如果不是由setText()造成文本的改变,那么会发出textEdit()信号;鼠标光标改变时会发出cursorPostionChanged()信号;当返回键或者回车键按下时,会发出returnPressed()信号。

当编辑结束,或者LineEdit失去了焦点,或者当返回/回车键按下时,editFinished()信号将会发出。

以上是Qt官方文档对QLineEdit的简要说明,下面根据个人经验,对一些常用的方法作说明:

1.setPlaceholderText()设置提示文字

豆瓣电影的搜索输入框,没有输入任何字符时,显示“电影、影人、影院、电视剧”这些占位文字,对用户输入作相关提示。

echoLineEdit->setPlaceholderText("电影、影人、影院、电视剧");

 2.setEchoMode()设置模式

淘宝登录界面的一部分,用户名可以直接看到,密码一般都用小黑点掩盖。

switch (index) {

    case 0:

        //默认,输入什么即显示什么

        echoLineEdit->setEchoMode(QLineEdit::Normal);

        break;

    case 1:

        //密码,一般是用小黑点覆盖你所输入的字符

        echoLineEdit->setEchoMode(QLineEdit::Password);

        break;

    case 2:

        //编辑时输入字符显示输入内容,否则用小黑点代替

        echoLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit);

        break;

    case 3:

        //任何输入都看不见(只是看不见,不是不能输入)

        echoLineEdit->setEchoMode(QLineEdit::NoEcho);

    }

3.setAlignment()设置文本位置

switch (index) {

    case 0:

        alignmentLineEdit->setAlignment(Qt::AlignLeft);

        break;

    case 1:

        alignmentLineEdit->setAlignment(Qt::AlignCenter);

        break;

    case 2:

        alignmentLineEdit->setAlignment(Qt::AlignRight);

    }

4.setReadOnly()设置能否编辑

switch (index) {

    case 0:

        accessLineEdit->setReadOnly(false);

        break;

    case 1:

        accessLineEdit->setReadOnly(true);

    }

 5.setValidator()对输入进行限制

这种方式的实质是通过正则表达式限制输入的内容。

比如上面的手机号输入框,控制其不能输入英文汉字等无关字符。

switch (index) {

    case 0:

        //无限制

        validatorLineEdit->setValidator(0);

        break;

    case 1:

        //只能输入整数

        validatorLineEdit->setValidator(new QIntValidator(

            validatorLineEdit));

        break;

    case 2:

        //实例,只能输入-180到180之间的小数,小数点后最多两位(可用于限制经纬度等)

        QDoubleValidator *pDfValidator = new QDoubleValidator(-180.0, 180.0 , 2, validatorLineEdit);

        pDfValidator->setNotation(QDoubleValidator::StandardNotation);

        validatorLineEdit->setValidator(pDfValidator);

    }

6.setInputMask()对输入进行限制

通过限制格式限制输入,具体怎么格式化可以参考Qt助手。

switch (index) {

    case 0:

        inputMaskLineEdit->setInputMask("");

        break;

    case 1:

        inputMaskLineEdit->setInputMask("+99 99 99 99 99;_");

        break;

    case 2:

        inputMaskLineEdit->setInputMask("0000-00-00");

        inputMaskLineEdit->setText("00000000");

        inputMaskLineEdit->setCursorPosition(0);

        break;

    case 3:

        inputMaskLineEdit->setInputMask(">AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;#");

    }

7.setMaxLength()设置可以输入的最多字符数

//最多只能输入9个字符

echoLineEdit->setMaxLength(9);

8.validator和inputmask的结合

比如纬度用“度:分:秒”的格式表示,分和秒的范围都是00-59,度的范围是-89到89。

QRegExp rx("(-|\\+)?[0-8]\\d:[0-5]\\d:[0-5]\\d");

echoLineEdit->setValidator(new QRegExpValidator(rx, echoLineEdit));

echoLineEdit->setInputMask("#00:00:00;0");

echoLineEdit->setText("+00:00:00");

如果不控制输入,那么必须在输入后检查输入是否合法,但控制输入后的输入肯定是合法的,可以省去检查合法的繁琐步骤。只需使用正则表达式控制输入的度分秒范围,然后控制输入的格式。

 

一些测试代码供参考——

头文件:

#ifndef WINDOW_H

#define WINDOW_H

 

#include <QWidget>

 

QT_BEGIN_NAMESPACE

class QComboBox;

class QLineEdit;

QT_END_NAMESPACE

 

//! [0]

class Window : public QWidget

{

    Q_OBJECT

 

public:

    Window();

 

public slots:

    void echoChanged(int);

    void validatorChanged(int);

    void alignmentChanged(int);

    void inputMaskChanged(int);

    void accessChanged(int);

 

private:

    QLineEdit *echoLineEdit;

    QLineEdit *validatorLineEdit;

    QLineEdit *alignmentLineEdit;

    QLineEdit *inputMaskLineEdit;

    QLineEdit *accessLineEdit;

};

//! [0]

 

#endif

 

实现:

#include <QtWidgets>

 

#include "window.h"

 

//! [0]

Window::Window()

{

    QGroupBox *echoGroup = new QGroupBox(tr("Echo"));

 

    QLabel *echoLabel = new QLabel(tr("Mode:"));

    QComboBox *echoComboBox = new QComboBox;

    echoComboBox->addItem(tr("Normal"));

    echoComboBox->addItem(tr("Password"));

    echoComboBox->addItem(tr("PasswordEchoOnEdit"));

    echoComboBox->addItem(tr("No Echo"));

 

    echoLineEdit = new QLineEdit;

    //test

    /*QRegExp rx("(-|\\+)?[0-8]\\d:[0-5]\\d:[0-5]\\d");

    echoLineEdit->setValidator(new QRegExpValidator(rx, echoLineEdit));

    echoLineEdit->setInputMask("#00:00:00;0");

    echoLineEdit->setText("+00:00:00");*/

 

    //echoLineEdit->setMaxLength(9);

    echoLineEdit->setPlaceholderText("电影、影人、影院、电视剧");

    echoLineEdit->setFocus();

//! [0]

 

//! [1]

    QGroupBox *validatorGroup = new QGroupBox(tr("Validator"));

 

    QLabel *validatorLabel = new QLabel(tr("Type:"));

    QComboBox *validatorComboBox = new QComboBox;

    validatorComboBox->addItem(tr("No validator"));

    validatorComboBox->addItem(tr("Integer validator"));

    validatorComboBox->addItem(tr("Double validator"));

 

    validatorLineEdit = new QLineEdit;

    validatorLineEdit->setPlaceholderText("Placeholder Text");

//! [1]

 

//! [2]

    QGroupBox *alignmentGroup = new QGroupBox(tr("Alignment"));

 

    QLabel *alignmentLabel = new QLabel(tr("Type:"));

    QComboBox *alignmentComboBox = new QComboBox;

    alignmentComboBox->addItem(tr("Left"));

    alignmentComboBox->addItem(tr("Centered"));

    alignmentComboBox->addItem(tr("Right"));

 

    alignmentLineEdit = new QLineEdit;

    alignmentLineEdit->setPlaceholderText("Placeholder Text");

//! [2]

 

//! [3]

    QGroupBox *inputMaskGroup = new QGroupBox(tr("Input mask"));

 

    QLabel *inputMaskLabel = new QLabel(tr("Type:"));

    QComboBox *inputMaskComboBox = new QComboBox;

    inputMaskComboBox->addItem(tr("No mask"));

    inputMaskComboBox->addItem(tr("Phone number"));

    inputMaskComboBox->addItem(tr("ISO date"));

    inputMaskComboBox->addItem(tr("License key"));

 

    inputMaskLineEdit = new QLineEdit;

    inputMaskLineEdit->setPlaceholderText("Placeholder Text");

//! [3]

 

//! [4]

    QGroupBox *accessGroup = new QGroupBox(tr("Access"));

 

    QLabel *accessLabel = new QLabel(tr("Read-only:"));

    QComboBox *accessComboBox = new QComboBox;

    accessComboBox->addItem(tr("False"));

    accessComboBox->addItem(tr("True"));

 

    accessLineEdit = new QLineEdit;

    accessLineEdit->setPlaceholderText("Placeholder Text");

//! [4]

 

//! [5]

    connect(echoComboBox, SIGNAL(activated(int)),

            this, SLOT(echoChanged(int)));

    connect(validatorComboBox, SIGNAL(activated(int)),

            this, SLOT(validatorChanged(int)));

    connect(alignmentComboBox, SIGNAL(activated(int)),

            this, SLOT(alignmentChanged(int)));

    connect(inputMaskComboBox, SIGNAL(activated(int)),

            this, SLOT(inputMaskChanged(int)));

    connect(accessComboBox, SIGNAL(activated(int)),

            this, SLOT(accessChanged(int)));

//! [5]

 

//! [6]

    QGridLayout *echoLayout = new QGridLayout;

    echoLayout->addWidget(echoLabel, 0, 0);

    echoLayout->addWidget(echoComboBox, 0, 1);

    echoLayout->addWidget(echoLineEdit, 1, 0, 1, 2);

    echoGroup->setLayout(echoLayout);

//! [6]

 

//! [7]

    QGridLayout *validatorLayout = new QGridLayout;

    validatorLayout->addWidget(validatorLabel, 0, 0);

    validatorLayout->addWidget(validatorComboBox, 0, 1);

    validatorLayout->addWidget(validatorLineEdit, 1, 0, 1, 2);

    validatorGroup->setLayout(validatorLayout);

 

    QGridLayout *alignmentLayout = new QGridLayout;

    alignmentLayout->addWidget(alignmentLabel, 0, 0);

    alignmentLayout->addWidget(alignmentComboBox, 0, 1);

    alignmentLayout->addWidget(alignmentLineEdit, 1, 0, 1, 2);

    alignmentGroup-> setLayout(alignmentLayout);

 

    QGridLayout *inputMaskLayout = new QGridLayout;

    inputMaskLayout->addWidget(inputMaskLabel, 0, 0);

    inputMaskLayout->addWidget(inputMaskComboBox, 0, 1);

    inputMaskLayout->addWidget(inputMaskLineEdit, 1, 0, 1, 2);

    inputMaskGroup->setLayout(inputMaskLayout);

 

    QGridLayout *accessLayout = new QGridLayout;

    accessLayout->addWidget(accessLabel, 0, 0);

    accessLayout->addWidget(accessComboBox, 0, 1);

    accessLayout->addWidget(accessLineEdit, 1, 0, 1, 2);

    accessGroup->setLayout(accessLayout);

//! [7]

 

//! [8]

    QGridLayout *layout = new QGridLayout;

    layout->addWidget(echoGroup, 0, 0);

    layout->addWidget(validatorGroup, 1, 0);

    layout->addWidget(alignmentGroup, 2, 0);

    layout->addWidget(inputMaskGroup, 0, 1);

    layout->addWidget(accessGroup, 1, 1);

    setLayout(layout);

 

    setWindowTitle(tr("Line Edits"));

}

//! [8]

 

//! [9]

void Window::echoChanged(int index)

{

    switch (index) {

    case 0:

        //默认,输入什么即显示什么

        echoLineEdit->setEchoMode(QLineEdit::Normal);

        break;

    case 1:

        //密码,一般是用小黑点覆盖你所输入的字符

        echoLineEdit->setEchoMode(QLineEdit::Password);

        break;

    case 2:

        //编辑时输入字符显示输入内容,否则用小黑点代替

        echoLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit);

        break;

    case 3:

        //任何输入都看不见(只是看不见,不是不能输入)

        echoLineEdit->setEchoMode(QLineEdit::NoEcho);

    }

}

//! [9]

 

//! [10]

void Window::validatorChanged(int index)

{

    switch (index) {

    case 0:

        //无限制

        validatorLineEdit->setValidator(0);

        break;

    case 1:

        //只能输入整数

        validatorLineEdit->setValidator(new QIntValidator(

            validatorLineEdit));

        break;

    case 2:

        //实例,只能输入-180到180之间的小数,小数点后最多两位(可用于限制经纬度等)

        QDoubleValidator *pDfValidator = new QDoubleValidator(-180.0, 180.0 , 2, validatorLineEdit);

        pDfValidator->setNotation(QDoubleValidator::StandardNotation);

        validatorLineEdit->setValidator(pDfValidator);

    }

 

    validatorLineEdit->clear();

}

//! [10]

 

//! [11]

void Window::alignmentChanged(int index)

{

    switch (index) {

    case 0:

        alignmentLineEdit->setAlignment(Qt::AlignLeft);

        break;

    case 1:

        alignmentLineEdit->setAlignment(Qt::AlignCenter);

        break;

    case 2:

        alignmentLineEdit->setAlignment(Qt::AlignRight);

    }

}

//! [11]

 

//! [12]

void Window::inputMaskChanged(int index)

{

    switch (index) {

    case 0:

        inputMaskLineEdit->setInputMask("");

        break;

    case 1:

        inputMaskLineEdit->setInputMask("+99 99 99 99 99;_");

        break;

    case 2:

        inputMaskLineEdit->setInputMask("0000-00-00");

        inputMaskLineEdit->setText("00000000");

        inputMaskLineEdit->setCursorPosition(0);

        break;

    case 3:

        inputMaskLineEdit->setInputMask(">AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;#");

    }

}

//! [12]

 

//! [13]

void Window::accessChanged(int index)

{

    switch (index) {

    case 0:

        accessLineEdit->setReadOnly(false);

        break;

    case 1:

        accessLineEdit->setReadOnly(true);

    }

}

//! [13]

### QLineEdit 控件概述 `QLineEdit` 是 Qt 中用于单行文本输入的基础控件。该控件允许用户输入和编辑文本,并提供了多种方式来控制和验证用户的输入。 #### 创建 `QLineEdit` 创建一个简单的 `QLineEdit` 实例非常直观: ```cpp QLineEdit *lineEdit = new QLineEdit(parent); ``` 其中,`parent` 参数指定了父窗口部件。 #### 设置占位符文本 可以设置提示文字,在没有输入时显示给用户作为指导: ```cpp lineEdit->setPlaceholderText("请输入内容"); ``` #### 输入掩码 为了简化某些特定格式的数据输入(如电话号码、IP 地址),可以通过设定输入掩码实现自动填充部分字符并限定输入范围。对于 IP 地址的输入限制为例[^2]: ```cpp QString ipMask = "000.000.000.000"; this->line_ip->setInputMask(ipMask); ``` 此操作会使得每次输入都遵循指定模式,超出规定长度的部分无法录入。 #### 数据验证 ##### 正则表达式验证 针对更复杂的输入规则,则需借助于正则表达式的强大功能来进行精确匹配。例如,当需要确保用户输入的是有效的电子邮件地址时,可采用如下方法构建验证逻辑[^1]: ```cpp // 定义邮件格式的正则表达式 QRegularExpression emailPattern("[a-zA-Z0-9-]+@[a-zA-Z0-9-_]+\\.[a-zA-Z]+"); // 构建验证器对象并与目标控件关联 auto validator = new QRegularExpressionValidator(emailPattern, lineEdit_Email); lineEdit_Email->setValidator(validator); ``` 需要注意的是,在不同版本之间存在差异——Qt 6.0 及以上推荐使用 `QRegularExpressionValidator` 替代旧版中的 `QRegExpValidator` 来完成这项工作。 #### 响应事件 通过信号槽机制监听文本变化或其他交互动作的发生。比如每当文本发生改变时触发某个处理函数: ```cpp connect(lineEdit_SignalSlotExample, &QLineEdit::textChanged, [=](const QString& text){ qDebug() << "当前文本:" << text; }); ``` 上述代码片段展示了如何连接到 `textChanged()` 信号以便实时获取最新状态更新的信息流。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值