用四个文本框来输入IP地址,对文本框设置了正则表达式来校验输入的有效性。
核心代码如下:
// 设置正则表示校验输入
QRegExp rx1("[1-9]{1}" // 1num: 1-9
"|[1-9]{1}[0-9]{1}" // 2num: 10-99
"|1[0-9]{2}" // 3num: 100-199
"|2[0-4]{1}[0-9]{1}" // 3num: 200-249
"|25[0-4]{1}" // 3num: 250-254
);
QRegExp rx2("[0-9]{1}" // 1num: 0-9
"|[1-9]{1}[0-9]{1}" // 2num: 10-99
"|1[0-9]{2}" // 3num: 100-199
"|2[0-4]{1}[0-9]{1}" // 3num: 200-249
"|25[0-5]{1}" // 3num: 250-255
);
QRegExpValidator *pReg1 = new QRegExpValidator(rx1, this);
QRegExpValidator *pReg2 = new QRegExpValidator(rx2, this);
ui->lineIP_1->setValidator(pReg1);
ui->lineIP_2->setValidator(pReg2);
ui->lineIP_3->setValidator(pReg2);
ui->lineIP_4->setValidator(pReg1);
// 输入失效后跳转到下一节IP输入
connect(ui->lineIP_1, &QLineEdit::inputRejected, this, [this]() {
ui->lineIP_2->setFocus();
});
connect(ui->lineIP_2, &QLineEdit::inputRejected, this, [this]() {
ui->lineIP_3->setFocus();
});
connect(ui->lineIP_3, &QLineEdit::inputRejected, this, [this]() {
ui->lineIP_4->setFocus();
});
以上代码意思很明确,简单明了,但是功能却失效了。首尾IP段限定只能输入 1~254的数字,中间两段限定只能输入 0~255的数字。但是却失效了,除了数字还能输入汉字,概率很高,根本不起作用?一度怀疑是Qt自身的问题,后来发现还真算是Qt的问题吧。
原因是:文本框设定了maxLength属性,设置为3,应该是这个限定和正则冲突了。maxLength属性恢复为默认值,问题解决。
Qt版本:5.13.2