zoukankan      html  css  js  c++  java
  • 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


  • 相关阅读:
    POJ1417 True Liars
    POJ2912 Rochambeau
    POJ3904 Sky Code
    [SDOI2016]排列计数
    POJ2947 Widget Factory
    HDU5015 233 Matrix
    Problem 2242. -- [SDOI2011]计算器
    POJ2480 Longge's problem
    Problem 2818. -- Gcd
    LA3510 Pixel Shuffle
  • 原文地址:https://www.cnblogs.com/linuxAndMcu/p/13354885.html
Copyright © 2011-2022 走看看