QLineEdit学习
轉(zhuǎn)載自https://www.cnblogs.com/wangjian8888/p/7678270.html
?
QLineEdit是一個(gè)單行文本編輯控件。
使用者可以通過很多函數(shù),輸入和編輯單行文本,比如撤銷、恢復(fù)、剪切、粘貼以及拖放等。
通過改變QLineEdit的?echoMode()?,可以設(shè)置其屬性,比如以密碼的形式輸入。
文本的長度可以由?maxLength()?限制,可以通過使用?validator()?或者?inputMask()?可以限制它只能輸入數(shù)字。在對(duì)同一個(gè)QLineEdit的validator或者input mask進(jìn)行轉(zhuǎn)換時(shí),最好先將它的validator或者input mask清除,以避免錯(cuò)誤發(fā)生。
與QLineEdit相關(guān)的一個(gè)類是QTextEdit,它允許多行文字以及富文本編輯。
我們可以使用?setText()?或者?insert()?改變其中的文本,通過?text()?獲得文本,通過?displayText()?獲得顯示的文本,使用?setSelection()?或者?selectAll()?選中文本,選中的文本可以通過cut()、copy()、paste()進(jìn)行剪切、復(fù)制和粘貼,使用?setAlignment()?設(shè)置文本的位置。
文本改變時(shí)會(huì)發(fā)出?textChanged()?信號(hào);如果不是由setText()造成文本的改變,那么會(huì)發(fā)出textEdit()信號(hào);鼠標(biāo)光標(biāo)改變時(shí)會(huì)發(fā)出cursorPostionChanged()信號(hào);當(dāng)返回鍵或者回車鍵按下時(shí),會(huì)發(fā)出returnPressed()信號(hào)。
當(dāng)編輯結(jié)束,或者LineEdit失去了焦點(diǎn),或者當(dāng)返回/回車鍵按下時(shí),editFinished()信號(hào)將會(huì)發(fā)出。
以上是Qt官方文檔對(duì)QLineEdit的簡要說明,下面根據(jù)個(gè)人經(jīng)驗(yàn),對(duì)一些常用的方法作說明:
1.setPlaceholderText()設(shè)置提示文字
豆瓣電影的搜索輸入框,沒有輸入任何字符時(shí),顯示“電影、影人、影院、電視劇”這些占位文字,對(duì)用戶輸入作相關(guān)提示。
| echoLineEdit->setPlaceholderText("電影、影人、影院、電視劇"); |
?2.setEchoMode()設(shè)置模式
淘寶登錄界面的一部分,用戶名可以直接看到,密碼一般都用小黑點(diǎn)掩蓋。
| switch?(index) { ????case?0: ????????//默認(rèn),輸入什么即顯示什么 ????????echoLineEdit->setEchoMode(QLineEdit::Normal); ????????break; ????case?1: ????????//密碼,一般是用小黑點(diǎn)覆蓋你所輸入的字符 ????????echoLineEdit->setEchoMode(QLineEdit::Password); ????????break; ????case?2: ????????//編輯時(shí)輸入字符顯示輸入內(nèi)容,否則用小黑點(diǎn)代替 ????????echoLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit); ????????break; ????case?3: ????????//任何輸入都看不見(只是看不見,不是不能輸入) ????????echoLineEdit->setEchoMode(QLineEdit::NoEcho); ????} |
3.setAlignment()設(shè)置文本位置
| switch?(index) { ????case?0: ????????alignmentLineEdit->setAlignment(Qt::AlignLeft); ????????break; ????case?1: ????????alignmentLineEdit->setAlignment(Qt::AlignCenter); ????????break; ????case?2: ????????alignmentLineEdit->setAlignment(Qt::AlignRight); ????} |
4.setReadOnly()設(shè)置能否編輯
| switch?(index) { ????case?0: ????????accessLineEdit->setReadOnly(false); ????????break; ????case?1: ????????accessLineEdit->setReadOnly(true); ????} |
?5.setValidator()對(duì)輸入進(jìn)行限制
這種方式的實(shí)質(zhì)是通過正則表達(dá)式限制輸入的內(nèi)容。
比如上面的手機(jī)號(hào)輸入框,控制其不能輸入英文漢字等無關(guān)字符。
| switch?(index) { ????case?0: ????????//無限制 ????????validatorLineEdit->setValidator(0); ????????break; ????case?1: ????????//只能輸入整數(shù) ????????validatorLineEdit->setValidator(new?QIntValidator( ????????????validatorLineEdit)); ????????break; ????case?2: ????????//實(shí)例,只能輸入-180到180之間的小數(shù),小數(shù)點(diǎn)后最多兩位(可用于限制經(jīng)緯度等) ????????QDoubleValidator *pDfValidator =?new?QDoubleValidator(-180.0, 180.0 , 2, validatorLineEdit); ????????pDfValidator->setNotation(QDoubleValidator::StandardNotation); ????????validatorLineEdit->setValidator(pDfValidator); ????} |
6.setInputMask()對(duì)輸入進(jìn)行限制
通過限制格式限制輸入,具體怎么格式化可以參考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()設(shè)置可以輸入的最多字符數(shù)
| //最多只能輸入9個(gè)字符 echoLineEdit->setMaxLength(9); |
8.validator和inputmask的結(jié)合
比如緯度用“度:分:秒”的格式表示,分和秒的范圍都是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"); |
如果不控制輸入,那么必須在輸入后檢查輸入是否合法,但控制輸入后的輸入肯定是合法的,可以省去檢查合法的繁瑣步驟。只需使用正則表達(dá)式控制輸入的度分秒范圍,然后控制輸入的格式。
?
一些測試代碼供參考——
頭文件:
| #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 |
?
實(shí)現(xiàn):
| #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: ????????//默認(rèn),輸入什么即顯示什么 ????????echoLineEdit->setEchoMode(QLineEdit::Normal); ????????break; ????case?1: ????????//密碼,一般是用小黑點(diǎn)覆蓋你所輸入的字符 ????????echoLineEdit->setEchoMode(QLineEdit::Password); ????????break; ????case?2: ????????//編輯時(shí)輸入字符顯示輸入內(nèi)容,否則用小黑點(diǎn)代替 ????????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: ????????//只能輸入整數(shù) ????????validatorLineEdit->setValidator(new?QIntValidator( ????????????validatorLineEdit)); ????????break; ????case?2: ????????//實(shí)例,只能輸入-180到180之間的小數(shù),小數(shù)點(diǎn)后最多兩位(可用于限制經(jīng)緯度等) ????????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); ????} } |
總結(jié)
以上是生活随笔為你收集整理的QLineEdit学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt ui界面编辑时Qlayout上有个
- 下一篇: NFS搭建openfoam