1. 程式人生 > >Qt——QLineEdit使用總結

Qt——QLineEdit使用總結

整數 space 之間 clas add edit password 拖放 highlight

http://www.cnblogs.com/hellovenus/p/5183593.html

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); } } //! [1

Qt——QLineEdit使用總結