QLineEdit学习
轉載自https://www.cnblogs.com/wangjian8888/p/7678270.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); ????} } |
總結
以上是生活随笔為你收集整理的QLineEdit学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt ui界面编辑时Qlayout上有个
- 下一篇: NFS搭建openfoam