目录
前言
在开发中,经常会碰到需要限制用户的输入,如只能输入数字 英文等。关于用户的文本输入一般使用QLineEdit QTextiEdit,对这两个控件的限制需要使用不同的方法。
QLineEdit的限制
众所周知,Qt中有setValidator方法可以限制QLineEdit的输入内容,包括已实现好的如QIntValidator、QDoubleValidator等,也可以使用正则表达式来限制输入,如下所示:
m_pLineEdit = new QLineEdit(this); //设置只能输入数字 m_pLineEdit->setValidator(new QIntValidator(1, 65535)); //设置只能输入英文大小写字母和英文逗号 QRegExp regexp; regexp.setPattern("^[a-zA-Z0-9,]+$"); m_pLineEdit->setValidator(new QRegExpValidator(regexp));
QTextEdit的限制
而QTextEdit不能与QLineEdit一样通过现有的方法来设置,只能另辟蹊径,因为QTextEdit在文本改变时会触发QTextEdit::textChanged 信号,所以可以获取实时改变的文本来限制输入,如下所示:
//连接信号槽 connect(ui.textEdit, &QTextEdit::textChanged, this, &Widget::textEditChanged); //槽函数实现 void Widget::textEditChanged() { //只能输入数字 字母 英文逗号 QRegExp reg; reg.setPattern("^[a-zA-Z0-9,]+$"); QString strText = ui.textEdit->toPlainText(); if (reg.exactMatch(strText)) { m_symtext = strText; } else { ui.textEdit->setText(m_symtext); } }
private: QString m_symtext;
此时能发现已经不能输入不合法的内容了,还有一个小缺陷,输入限制内容时,光标会跳到最前面,这个也可以进行限制,完整内容:
void Widget::textEditChanged() { //只能输入数字 字母 英文逗号 QRegExp reg; reg.setPattern("^[a-zA-Z0-9,]+$"); QString strText = ui.textEdit->toPlainText(); if (reg.exactMatch(strText)) { m_symtext = strText; } else { int offset = strText.length() - m_symtext.length(); //改变光标的位置 QTextCursor cursor = ui.textEdit->textCursor(); auto pos = cursor.position(); pos = pos >= offset ? pos - offset : pos; ui.textEdit->setText(m_symtext); cursor.setPosition(pos); ui.textEdit->setTextCursor(cursor); } }
补充:QTextEdit限制文本长度
QString textContent = this->toPlainText(); int length = textContent.count(); int maxLength = maxLen; // 最大字符数 if(length > maxLength) { int position = this->textCursor().position(); QTextCursor textCursor = this->textCursor(); textContent.remove(position - (length - maxLength), length - maxLength); this->setText(textContent); textCursor.setPosition(position - (length - maxLength)); this->setTextCursor(textCursor); }