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


  • 相关阅读:
    Atitit 华为基本法 attilax读后感
    Atitit 华为管理者内训书系 以奋斗者为本 华为公司人力资源管理纲要 attilax读后感
    Atitit 项目版本管理gitflow 与 Forking的对比与使用
    Atitit 管理的模式扁平化管理 金字塔 直线型管理 垂直管理 水平管理 矩阵式管理 网状式样管理 多头管理 双头管理
    Atitit 乌合之众读后感attilax总结 与读后感结构规范总结
    深入理解 JavaScript 异步系列(4)—— Generator
    深入理解 JavaScript 异步系列(3)—— ES6 中的 Promise
    深入理解 JavaScript 异步系列(2)—— jquery的解决方案
    深入理解 JavaScript 异步系列(1)——基础
    使用 github + jekyll 搭建个人博客
  • 原文地址:https://www.cnblogs.com/linuxAndMcu/p/13354885.html
Copyright © 2011-2022 走看看