94

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

那么是否有一个仅限数字的设置QLineEdit

4

6 回答 6

144

QLineEdit::setValidator(), 例如:

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

或者

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

请参阅:QIntValidatorQDoubleValidatorQLineEdit:: setValidator

于 2012-11-16T19:36:40.303 回答
29

最好的是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)));
于 2013-10-12T21:37:54.483 回答
18

正则表达式验证器

到目前为止,其他答案只为相对有限的数字提供了解决方案。但是,如果您关心任意可变数量的数字,您可以使用 a 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 的跨平台架构......

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

于 2019-02-24T08:08:40.780 回答
10

您还可以设置一个inputMask

QLineEdit.setInputMask("9")

这允许用户只键入一个数字,范围从09。使用多个9's 允许用户输入多个数字。另请参阅可在输入掩码中使用的字符的完整列表。

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

于 2014-09-30T16:01:55.197 回答
7

你为什么不使用 aQSpinBox来达到这个目的?您可以使用以下代码行将向上/向下按钮设置为不可见:

// ...
QSpinBox* spinBox = new QSpinBox( this );
spinBox->setButtonSymbols( QAbstractSpinBox::NoButtons ); // After this it looks just like a QLineEdit.
//...
于 2015-05-11T21:01:07.043 回答
0

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

#include <QIntValidator>

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

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

我希望这有帮助。

于 2016-04-14T01:14:21.720 回答