QDoubleValidator无法正常工作?

9
我正在尝试在Qt 4.2的行编辑框中应用验证器,但它没有起作用:
 QDoubleValidator *haha= new QDoubleValidator(this);
 haha->setBottom(0.00);
 haha->setDecimals(2);
 haha->setTop(100.00); 
 get_line_edit()->setValidator(haha);

或者

 QDoubleValidator *haha= new QDoubleValidator(0.00,100.00,2,this);

无论如何,我仍然可以输入任何值。

但是如果我切换到QIntValidator,它就可以工作了!

于是我上了Google搜索了一下,发现很多人都遇到了同样的问题。这是一个bug吗?还是我应该进行其他设置?


我不是很清楚,但你有检查它是否允许指数符号吗?例如100000e-4。 - Johannes Schaub - litb
谢谢Johan,我尝试设置一个注释但是返回错误:“setNotation”:不是“QDoubleValidator”的成员... - user987013
OHH,而且我正在使用qt 4.2 - user987013
7个回答

11

刚刚发现了这个问题。尝试将QDoubleValidator的符号设置为:

doubleValidator->setNotation(QDoubleValidator::StandardNotation);

6
验证器文档说明,当输入是任意双精度数但超出范围时,“validate”会返回“Intermediate”。
您需要通过使用行编辑控件(例如发出“returnPressed”信号)来区分中间输入和用户想要提交的最终输入。如果用户键入“10000”,则对于0到100之间的数字,该输入仍然是有效的中间输入,因为用户可以在此输入前缀“0.”。

嗨Johan,谢谢你的回答。我之前已经尝试过在“按下返回键”之前发出信号,并且我也尝试了从完整数字(例如“10.55”)中输入更多数字,但我仍然能够添加像.100002121212121.55这样的数字... - user987013
1
请参阅http://www.qtcentre.org/threads/50724-set-the-validation-for-LineEdit?p=227965#post227965,了解更多关于为什么它不起作用以及*如何*使用它的详细信息。 - Ad N

1

你必须为你的验证器设置符号

QLineEdit *firstX;
QDoubleValidator* validFirstX = new QDoubleValidator(-1000, 1000, 3, ui.firstX); 
validFirstX->setNotation(QDoubleValidator::StandardNotation);

然后它可以工作,但不是完全正确的。有趣的是,它控制的是数字位数而不是数字本身。例如,在这个例子中,你可以在QLineEdit中输入1000或9999。


1

&& (input.toDouble() > top() || input.toDouble() < bottom())


0

为了澄清,使用QDoubleValidator::setNotation(QDoubleValidator::StandardNotation)

示例:

QDoubleValidator* doubleValidator = new QDoubleValidator(-999.0, 999.0, 2, validatorLineEdit);
doubleValidator->setNotation(QDoubleValidator::StandardNotation);
validatorLineEdit->setValidator(doubleValidator);

0

这个例子在4.8版本中运行良好。它看起来自4.2版本以来没有改变,因此我怀疑问题出在您创建QLineEdit的方式上。以下是该示例中相关的代码。

QLineEdit* validatorLineEdit;
validatorLineEdit = new QLineEdit;
validatorLineEdit->setValidator( new QDoubleValidator(-999.0, 999.0, 2, validatorLineEdit));

你是如何创建你的行编辑器的?

1
不,确认输入是否可接受可以防止无效的输入,如果我没记错的话。 - Johannes Schaub - litb

0
如果你给一个 QLineEdit 设置了验证器,那么你可以使用函数 hasAcceptableInput() 来检查输入的值是否有效或无效。例如:
if (!ui->lineEdit_planned_count_vrt->hasAcceptableInput())
{
    slot_show_notification_message("EDIT_PLAN_COUNT_VRT", notification_types::ERROR, INVALID_INPUTED_VALUE);
    return;
}
bool isOk = false;
double value = ui->lineEdit_planned_count_vrt->text().toDouble(&isOk);
//do something with the value here....

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