Qt—QLineEdit 使用总结

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

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

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

文本的长度可以由 maxLength() 限制,可以通过使用 validator() 或者 inputMask() 可以限制它只能输入数字。

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

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

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

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

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


setPlaceholderText()设置提示文字

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

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

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);
}

setAlignment()设置文本位置

switch (index) {
    case 0:
        alignmentLineEdit->setAlignment(Qt::AlignLeft);
        break;
    case 1:
        alignmentLineEdit->setAlignment(Qt::AlignCenter);
        break;
    case 2:
        alignmentLineEdit->setAlignment(Qt::AlignRight);
}

setReadOnly()设置能否编辑

switch (index) {
    case 0:
        accessLineEdit->setReadOnly(false);
        break;
    case 1:
        accessLineEdit->setReadOnly(true);
}

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);
}

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;#");
}

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

// 最多只能输入9个字符
echoLineEdit->setMaxLength(9);

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");

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

还有一个例子:

这里写图片描述

QLineEdit *pIPLineEdit = new QLineEdit(this);
QLineEdit *pMACLineEdit = new QLineEdit(this);
QLineEdit *pDateLineEdit = new QLineEdit(this);
QLineEdit *pLicenseLineEdit = new QLineEdit(this);

pIPLineEdit->setInputMask("000.000.000.000;_");
pMACLineEdit->setInputMask("HH:HH:HH:HH:HH:HH;_");
pDateLineEdit->setInputMask("0000-00-00");
pLicenseLineEdit->setInputMask(">AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;#");

测试代码

头文件:

#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]

参考:

Qt——QLineEdit使用总结

Qt 之 QLineEdit


posted @ 2020-07-21 14:34  fengMisaka  阅读(1443)  评论(0编辑  收藏  举报