Qt常用控件之单行输入框QLineEdit
单行输入框QLineEdit
QLineEdit
是一个单行输入框控件,可用输入一段文本,但是不能换行。
1. QLineEdit属性
属性 | 说明 |
---|---|
text | 输入框中的文本。 |
inputMask | 输入框内容格式约束。 |
maxLength | 最大长度。 |
frame | 是否添加边框。 |
echoMode | 显示方式。QLineEdit::Normal 为默认值,输入框会显示输入的文本;QLineEdit::Password 为隐藏模式,输入框的内容会被特殊符号隐藏;QLineEdit::NoEcho 为无回显模式,输入框的内容为空白不显示。 |
cursorPosition | 光标所在位置。 |
alignment | 文字对齐方式,可设置水平和垂直方向的对齐。 |
dragEnabled | 是否允许拖拽。 |
readOnly | 是否是只读(不可修改)的。 |
placeHolderText | 当输入框为空时,显示的内容(即显示提示信息)。 |
clearButtonEnabled | 是否显示 “一键清除按钮” 。 |
2. QLineEdit信号
信号 | 说明 |
---|---|
voidcursorPositionChanged(int old, int new) | 当鼠标移动时发出此信号,old 为先前的位置,new 为新位置。 |
void editingFinished() | 当按返回或者回车键时,或者行编辑失去焦点时,发出此信号。 |
void returnPressed() | 当返回或回车键按下时发出此信号.如果设置了验证器,必须要验证通过,才能触发。 |
void selectionChanged() | 当选中的文本改变时,发出此信号。 |
void textChanged(const QString &text)) | 当 QLineEdit 中的文本改变时,发出此信号,text 是新的文本。代码对文本的修改能够触发这个信号。 |
void textEdited(const QString &text)) | 当QLineEdit中的文本改变时,发出此信号,text 是新的文本。代码对文本的修改不能触发这个信号。 |
3. 关于intputMask属性
intputMask
表示输入框内容格式约束,可用 0
或 d
表示数字的占位符,用 a
表示字母或汉字的占位符,其他的字符输进去相当于不可被删除的文本。
如调用 setInputMask("000")
,则该对应的文本框可输入 3 个数字:
如调用 setInputMask("aaaa")
,则该对应的文本框可输入 4 个字母或汉字:
inputMask
中的其他字符都会变成不可被修改的固定内容,如调用 setInputMask("000-0000-0000")
,则输入框可呈现这种样式:
3.1 validator与正则表达式
intputMask
的限制比较简单,如果需要更复杂的输入格式显示,需要使用正则表达式进行限制。QLineEdit
中有一个 setValidator()
的接口,向其中传入一个 Qt 内置的 QRegExp
(正则表达式)类型的参数,就可以通过该参数设置 QLineEdit
的正则表达式规则:
#include <QRegExpValidator>
QRegExp regExp("\\d{10}$");//限制只能且必须输入10个数字
ui->lineEdit->setValidator(new QRegExpValidator(regExp));
在使用 validator
对输入框进行限制的判断中,需要注意一个接口:
virtual QValidator::State validate(QString &input, int &pos) const override
input
:是需要验证内容(注意该类型为 QString &
,QLineEdit
的相关槽函数的类型可能是 const QString &
,使用是需要转换一下)。
pos
:是输入框不合法字符的位置(实际不需要特别考虑,传入 0 也可以)。
reval
:返回值是一个枚举类型 QValidator::State
,如果为 QValidator::Acceptable
则表示该内容符合正则表达式规则,为 QValidator::Invalid
则为不符合。
#include "widget.h"
#include "ui_widget.h"
#include <QRegExpValidator>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QRegExp regExp("\\d{10}$");//限制只能且必须输入10个数字
ui->lineEdit->setValidator(new QRegExpValidator(regExp));
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_lineEdit_textEdited(const QString &arg1)
{
QString context=arg1;
int pos =0;
if(ui->lineEdit->validator()->validate(context,pos)==QValidator::Acceptable)
{
ui->pushButton->setEnabled(true);
}
else
{
ui->pushButton->setEnabled(false);
}
}
当输入的数字不足 10 个时,按钮设置为灰色。当输入的数字为 10 个时,按钮才可点击。且不可输入字母或汉字。
4. 使用QLineEdit制作两次输入密码一致验证
只需要在 textEdited()
中对两个输入框做相等判断即可:
#include "widget.h"
#include "ui_widget.h"
#include <QRegExpValidator>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->lineEdit->setEchoMode(QLineEdit::Password);
ui->lineEdit_2->setEchoMode(QLineEdit::Password);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_lineEdit_textEdited(const QString &arg1)
{
(void) arg1;//过滤告警
const QString& s1=ui->lineEdit->text();
const QString& s2=ui->lineEdit_2->text();
if(s1.isEmpty()||s2.isEmpty())
{
ui->label->setText("密码为空!");
}
else if(s1==s2)
{
ui->label->setText("两次密码相同!");
}
else
{
ui->label->setText("两次密码不同!");
}
}
void Widget::on_lineEdit_2_textEdited(const QString &arg1)
{
(void) arg1;//过滤告警
const QString& s1=ui->lineEdit->text();
const QString& s2=ui->lineEdit_2->text();
if(s1.isEmpty()||s2.isEmpty())
{
ui->label->setText("密码为空!");
}
else if(s1==s2)
{
ui->label->setText("两次密码相同!");
}
else
{
ui->label->setText("两次密码不同!");
}
}
5. 使用QLineEdit制作密码显示与密码隐藏按钮
在 RadioButton
的槽函数中切换输入框的 echoMode
属性的值即可,注意这里按钮的槽函数使用 toggled()
比 clicked()
更合适:
#include "widget.h"
#include "ui_widget.h"
#include <QRegExpValidator>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->lineEdit->setEchoMode(QLineEdit::Password);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_radioButton_toggled(bool checked)
{
if(checked==true)
{
ui->lineEdit->setEchoMode(QLineEdit::Normal);
}
else
{
ui->lineEdit->setEchoMode(QLineEdit::Password);
}
}