将QLineEdit设置为仅接受数字


83

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

因此,是否有仅数字设置QLineEdit

Answers:


135

QLineEdit::setValidator(), 例如:

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

要么

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

参见:QIntValidatorQDoubleValidatorQLineEdit :: setValidator


4
可以从Qt Designer中完成此操作,还是只能通过代码完成?
sashoalm 2014年

2
据我所知,设计师无法做到这一点。
克里斯

如果您需要以科学计数法(例如3.14e-7)给出的输入,这是一种快速的解决方案。QDoubleSpinBox不接受科学计数法(Qt 5.5)中的数字。
Frederik Aalund

如果我输入(1,100),它将仍然接受0作为输入。此外,我可以无限期地写0(不只是3次)!
McLan 2015年

2
又见QRegExpValidator与QRegExp( “[0-9] *”)。
user2962533

28

最好的是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
即使OP希望与QLineEdit一起使用,使用QSpinBox绝对是最好的方法。
DrHaze

2
当数字范围较小时,此方法有效。考虑一下您可能想使用此小部件的年龄或ID。
史蒂夫(Steve)

有什么方法可以使Spinbox更加键盘友好,以便仅使用数字键,小数点分隔符和退格键工作?
米卡16年

10

正则表达式验证器

到目前为止,其他答案仅提供了相对有限数量的数字的解决方案。但是,如果您担心数字的任意可变QRegExpValidator,则可以使用a ,并传递仅接受数字的正则表达式(如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".     

更多在线编辑行为

根据文件

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

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

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

请注意,我仅在macOS上使用Qt 5.11进行了此测试,而未在其他Qt版本或操作系统上进行过测试。但是考虑到Qt的跨平台架构...

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



7

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

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

-1

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

#include <QIntValidator>

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

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

我希望这有帮助。


8
您的构造函数调用应为new QIntValidator(this),否则,只要窗口小部件超出范围,验证器对象就会泄漏。
亚历山德罗斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.