将QLineEdit设置为仅接受数字

104

我有一个QLineEdit,用户只能输入数字。

那么,QLineEdit有一个只允许输入数字的设置吗?


QSpinBox作为答案。 - Chris P
6个回答

158

5
这可以在Qt Designer中完成吗,还是只能通过编码实现? - sashoalm
2
据我所知,在设计师中没有办法做到这一点。 - Chris
如果您需要以科学计数法(例如 3.14e-7)输入,则以下是一个快速解决方案。QDoubleSpinBox 不接受科学计数法表示的数字(Qt 5.5)。 - Frederik Aalund
1
如果我输入(1,100),它仍然会接受0作为输入。此外,我可以无限制地写0(不仅仅是三次)!! - McLan
3
请参阅使用QRegExp("[0-9]*")的QRegExpValidator - user2962533
显示剩余4条评论

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更加键盘友好,只能使用数字键、小数分隔符和退格键进行操作? - Micka

20

正则表达式验证器

到目前为止,其他答案仅针对相对有限数量的数字提供解决方案。然而,如果你关注一个任意可变数量的数字,你可以使用一个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".     

更多关于行编辑行为的内容

根据文档

请注意,如果在行编辑器上设置了验证程序,则仅当验证程序返回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的跨平台架构...

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


10

你还可以设置一个inputMask

QLineEdit.setInputMask("9")

这允许用户只输入一个从09的数字。使用多个9可以允许用户输入多个数字。另请参见可用于输入掩码的字符的完整列表。(我的答案是Python,但将其转换为C++应该不难)


7
为什么不使用 QSpinBox 来实现这个目的呢?你可以使用以下代码将上/下按钮设置为不可见:
// ...
QSpinBox* spinBox = new QSpinBox( this );
spinBox->setButtonSymbols( QAbstractSpinBox::NoButtons ); // After this it looks just like a QLineEdit.
//...

请注意,NoButons 实际上并没有移除按钮,它只是将它们的颜色设置为 QSpinBox 的背景颜色。因此,在某些样式中,箭头很大,你会发现 QSpinBox 的一个非常大的部分看起来是空白的,这会挤压输入字段的其余部分,让人感到烦恼。 - Michael

0
如果您正在使用QT Creator 5.6,您可以像这样操作:
#include <QIntValidator>

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

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

希望这能有所帮助。


10
你的构造函数调用应该是 new QIntValidator(this),否则当你的窗口小部件超出范围时,验证器对象将会泄漏。请注意不要改变原意,并使翻译通俗易懂。 - Alexandros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接