将QLineEdit设置为仅接受数字

时间:2012-11-16 19:18:53

标签: c++ qt qlineedit

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

QLineEdit是否只有数字设置?

6 个答案:

答案 0 :(得分:109)

QLineEdit::setValidator(),例如:

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

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

请参阅:QIntValidatorQDoubleValidatorQLineEdit::setValidator

答案 1 :(得分:20)

最好的是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 :(得分:7)

您还可以设置inputMask

QLineEdit.setInputMask("9")

这允许用户只键入一个从09的数字。使用多个9来允许用户输入多个号码。另请参阅完整的list of characters that can be used in an input mask

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

答案 3 :(得分:7)

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

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

答案 4 :(得分:1)

到目前为止,其他答案仅针对相对数量有限的数字提供了解决方案。但是,如果您担心任意变量位数,则可以使用QRegExpValidator,并传递仅接受数字的正则表达式(如前所述)通过user2962533's comment)。这是一个最小的完整示例:

#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 at least have 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 0 and 1 for a maximum of 4 digits (e.g. for binary).
QRegExp("0x[0-9a-fA-F]")  //  matches a hex 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 rudimentary ip address. Of course, it's rudimentary 
                          //    because you can still enter an invalid address: "999.999.999.999".     

根据documentation

  

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

因此,即使尚未达到最小数量,行编辑仍将允许用户输入数字。例如。即使用户尚未针对正则表达式"[0-9]{3,}"输入任何文本(至少需要3位数字),行编辑仍然允许用户键入输入以达到最低要求 reach 。但是,一旦用户点击 Enter 或用零位,一位或两位数字完成编辑,则该输入将无效。

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

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

结束语。

也很有趣,I wrote up a widget showcasing the above regexp validators

答案 5 :(得分:-2)

如果你正在使用QT Creator 5.6,你可以这样做:

#include <QIntValidator>

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

我建议您在ui&gt; setupUi(this);

之后放置该行

我希望这会有所帮助。