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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM