将 QLineEdit 设置为仅接受数字

Set QLineEdit to accept only numbers

提问人:sashoalm 提问时间:11/17/2012 最后编辑:Tabsashoalm 更新时间:8/8/2019 访问量:148418

问:

我有一个用户应该只输入数字的地方。QLineEdit

那么有没有纯数字的设置?QLineEdit

C++ Qt QLine编辑

评论


答:

159赞 Chris 11/17/2012 #1

QLineEdit::setValidator()例如:

myLineEdit->setValidator( new QIntValidator(0, 100, this) );

myLineEdit->setValidator( new QDoubleValidator(0, 100, 2, this) );

请参见:QIntValidatorQDoubleValidatorQLineEdit::setValidator

评论

5赞 sashoalm 3/25/2014
这可以从Qt Designer中完成,还是只能通过代码完成?
2赞 Chris 4/4/2014
据我所知,在设计师中没有办法做到这一点。
0赞 Frederik Aalund 9/1/2015
如果您需要以科学记数法输入(例如,)。 不接受科学记数法(Qt 5.5)中的数字。3.14e-7QDoubleSpinBox
1赞 McLan 12/15/2015
如果我输入 (1,100),它仍然会接受 0 作为输入。此外,我可以无限期地写 0(不仅仅是三次)!!
3赞 user2962533 6/15/2016
另请参阅 QRegExpValidator 和 QRegExp(“[0-9]*”)。
28赞 ImmortalPC 10/13/2013 #2

最好的是QSpinBox

对于双精度值,请使用 QDoubleSpinBox

QSpinBox myInt;
myInt.setMinimum(-5);
myInt.setMaximum(5);
myInt.setSingleStep(1);// Will increment the current value with 1 (if you use up arrow key) (if you use down arrow key => -1)
myInt.setValue(2);// Default/begining value
myInt.value();// Get the current value
//connect(&myInt, SIGNAL(valueChanged(int)), this, SLOT(myValueChanged(int)));

评论

2赞 DrHaze 2/24/2015
即使 OP 想要使用 QLineEdit,使用 QSpinBox 也绝对是最好的方法。
2赞 Steve 6/7/2016
当数字范围较小时,这有效。想想看,您可能希望将此小部件用于年龄或 id。
0赞 Micka 8/4/2016
有什么方法可以使 Spinbox 对键盘更友好,以便仅使用数字键、小数分隔符和退格键?
10赞 Stefan van den Akker 10/1/2014 #3

您还可以设置 inputMask

QLineEdit.setInputMask("9")

这允许用户仅键入一个介于 和 之间的数字。使用多个 ' 允许用户输入多个数字。另请参阅可在输入掩码中使用的字符的完整列表099

(我的答案是用Python,但将其转换为C++应该不难)

7赞 p.i.g. 5/12/2015 #4

你为什么不为此目的使用 a ?您可以使用以下代码行将向上/向下按钮设置为不可见:QSpinBox

// ...
QSpinBox* spinBox = new QSpinBox( this );
spinBox->setButtonSymbols( QAbstractSpinBox::NoButtons ); // After this it looks just like a QLineEdit.
//...

评论

0赞 Michael 3/15/2021
请注意,NoButons实际上并没有删除按钮,它只是使它们与QSpinBox的背景颜色相同。因此,在某些箭头较大的样式中,QSpinBox 的更大部分看起来很烦人,并且会挤压输入字段的其余部分
0赞 Roberto Sepúlveda Bravo 4/14/2016 #5

如果您使用的是 QT Creator 5.6,您可以这样做:

#include <QIntValidator>

ui->myLineEditName->setValidator( new QIntValidator);

我建议你把那行放在ui->setupUi(this)之后;

我希望这会有所帮助。

评论

10赞 Alexandros 6/20/2016
您的构造函数调用应该是 ,否则一旦您的小部件超出范围,验证器对象就会泄漏。new QIntValidator(this)
20赞 TrebledJ 2/24/2019 #6

正则表达式验证器

到目前为止,其他答案仅为相对有限的数字数提供解决方案。但是,如果您关心的是任意可变数量的数字,则可以使用 QRegExpValidator,传递仅接受数字的正则表达式(如 user2962533 的注释所述)。下面是一个最小但完整的示例:

#include <QApplication>
#include <QLineEdit>
#include <QRegExpValidator>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QLineEdit le;
    le.setValidator(new QRegExpValidator(QRegExp("[0-9]*"), &le));
    le.show();

    return app.exec();
}

这有其优点(这只是轻描淡写)。它允许进行一系列其他有用的验证:QRegExpValidator

QRegExp("[1-9][0-9]*")    //  leading digit must be 1 to 9 (prevents leading zeroes).
QRegExp("\\d*")           //  allows matching for unicode digits (e.g. for 
                          //    Arabic-Indic numerals such as ٤٥٦).
QRegExp("[0-9]+")         //  input must have at least 1 digit.
QRegExp("[0-9]{8,32}")    //  input must be between 8 to 32 digits (e.g. for some basic
                          //    password/special-code checks).
QRegExp("[0-1]{,4}")      //  matches at most four 0s and 1s.
QRegExp("0x[0-9a-fA-F]")  //  matches a hexadecimal number with one hex digit.
QRegExp("[0-9]{13}")      //  matches exactly 13 digits (e.g. perhaps for ISBN?).
QRegExp("[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}")
                          //  matches a format similar to an ip address.
                          //    N.B. invalid addresses can still be entered: "999.999.999.999".     

更多在线编辑行为

根据文档

请注意,如果在行 edit 上设置了验证器,则仅当验证器返回 QValidator::Acceptable 时才会发出 returnPressed()/editingFinished() 信号。

因此,即使尚未达到最小数量,行编辑将允许用户输入数字。例如,即使用户没有根据正则表达式输入任何文本(至少需要 3 位数字),行编辑仍允许用户键入输入以达到该最低要求。但是,如果用户在未满足“至少 3 位数字”的要求的情况下完成编辑,则输入将无效;信号,不会发出。"[0-9]{3,}"returnPressed()editingFinished()

如果正则表达式具有最大边界(例如),则行编辑将停止任何超过 4 个字符的输入。此外,对于字符集(即 、 、 等),行编辑只允许输入该特定集中的字符。"[0-1]{,4}"[0-9][0-1][0-9A-F]

请注意,我只在macOS上使用Qt 5.11对此进行了测试,而不是在其他Qt版本或操作系统上。但考虑到Qt的跨平台模式......

演示:正则表达式验证器展示