我有一个
QLineEdit
,其中 InputMask
设置为 ">AAAA90"
,也就是说,我希望文本恰好由 4 个大写 Ascii 字母和 1-2 个数字组成。但如果用户输入“AA1”,则QLineEdit
会显示AA 1
,即会插入两个空格并在第5个位置打印允许的“1”。我宁愿想要在任何位置都有非法字符的行为,即如果用户键入“AA%”,则光标停留在第三个位置并且不打印“%”字符。
这在QT5中可能吗?
感谢 @Mike 关于 QValidator 的提示,我最终连接了一个像
这样的验证器 QRegExp rgx("[a-zA-Z]{4}\\d{1,2}");
QValidator *comValidator = new QRegExpValidator (rgx, this);
comLineEdit->setValidator(comValidator);
并将
textEdited
与:
void MainWindow::comTextEdited(const QString &arg1)
{
qobject_cast<QLineEdit*>(sender())->setText(arg1.toUpper());
}
强制前 4 个字符为大写。
请注意,输入掩码不会在返回的文本中insert空格(即
QLineEdit::text()
方法的返回值),尽管在GUI中插入空格是为了提高可读性。
为了更清楚地说明,输入掩码使
QLineEdit
在 overwrite 模式而不是 insert 模式下工作。但设置 QValidator
会使 QLineEdit
在 insert 模式下工作不变。
例如,如果您输入
"AA3"
,GUI 会显示 "AA 3"
,但 text()
方法返回 AA3
。如果您现在将光标移回第三个位置并输入 "B"
,GUI 将显示 "AAB 3"
(不是 "AAB 3"
,因为我们处于 overwite 模式)并且 text()
方法返回 "AAB3"
。
对于任何感兴趣的人,
QRegExpValidator
在Qt6中已被弃用,但有一个新的QRegularExpressionValidator
,所以@Reimundo的示例将是这样的:
QRegularExpression rgx("[a-zA-Z]{4}\\d{1,2}");
QValidator *comValidator = new QRegularExpressionValidator(rgx, this);
comLineEdit->setValidator(comValidator);