我在向QLineEdit输入值时遇到问题。这是一个更合乎逻辑的问题。我的要求是我想限制用户输入60到150之间的值,包括该范围内的十进制值,即65.5或140.5等。如果他输入超出此范围的值,我想向用户显示一条消息。
我的方法是:我在ui设计器中将此“QLineEdit”的“maxLength”属性设置为5,这样用户就可以只输入5个字符,如140.5。然后在“textChanged”插槽中,我编写了以下代码:
void MyWidget::on_lineEdit_textChanged(QString text)
{
if ((text.size() >= 3) && (text.toFloat() > 150 || text.toFloat() < 60))
{
QMessageBox::information(this, "Info", "Range should be between 60 and 150.", QMessageBox::Ok);
ui->lineEdit->setText("");
}
else
{
ui->lineEdit->setText(text);
}
}
还使用以下代码进行验证,如:
QRegExp rx("^[-+]?[0-9]*\\.?[0-9]+$");
QValidator *validator = new QRegExpValidator(rx, this);
ui->lineEdit->setValidator(validator);
上面的代码工作正常。唯一的问题是,如果第一次使用的值小于60,则不会显示消息,因为我正在检查条件[B](text.size()&gt; = 3)[/ B]。仅当text.size()&gt; = 3时才显示消息。我无法为此案例提供正确的逻辑。是否可以更改逻辑以显示要满足范围的用户。 请告诉我。 感谢。
答案 0 :(得分:0)
void number_test::Slot(const QString& str)
{
QString sttt = str;
bool bb = sttt.contains(QChar('.'));
if(!bb)
{
int nSize = sttt.size();
if(nSize == 1)
{
if(sttt.toInt() < 6 && sttt.toInt() != 1)
{
QMessageBox::information(this, "Info", "Range should be between 60 and 150.", QMessageBox::Ok);
clear();
}
}
else if(nSize == 2)
{
if(sttt.toFloat() < 60.0)
{
QMessageBox::information(this, "Info", "Range should be between 60 and 150.", QMessageBox::Ok);
clear();
}
}
else if(nSize >= 3)
{
if(sttt.toFloat() > 150.0)
{
QMessageBox::information(this, "Info", "Range should be between 60 and 150.", QMessageBox::Ok);
clear();
}
}
}
else
{
int nSize = sttt.size();
if(nSize == 1)
{
if(sttt.toInt() < 6 && sttt.toInt() != 1)
{
QMessageBox::information(this, "Info", "Range should be between 60 and 150.", QMessageBox::Ok);
clear();
}
}
else
{
if(sttt.toFloat() > 150.0 || sttt.toFloat() < 60.0)
{
QMessageBox::information(this, "Info", "Range should be between 60 and 150.", QMessageBox::Ok);
clear();
}
}
}
}
请针对您的问题尝试这些代码。
答案 1 :(得分:0)
这看起来像是QDoubleValidator !!!
的情况http://developer.qt.nokia.com/doc/qt-4.8/qdoublevalidator.html
QDoubleValidator *v = new QDoubleValidator(60.0,150.0);
ui->lineEdit->setValidator(v);
编辑:如果您希望在无效文本上弹出消息框,则可以使用已使用的插槽内的验证器。
void MyWidget::on_lineEdit_textChanged(QString text)
{
QDoubleValidator v(60.0,150.0);
if(v.validate(text) != QValidator::Acceptable)
{
QMessageBox::information(this, "Info", "Range should be between 60 and 150.", QMessageBox::Ok);
}
}
我没有对此进行测试,但我认为它应该或多或少地起作用,因为OP也想要它。
答案 2 :(得分:0)
这已经解决了。我已经实现了如下代码:
void MyWidget::on_lineEdit_textChanged(QString text)
{
if(text.startsWith('.'))
{
QMessageBox::information(this, "Info", "Range should be between 60 and 150.", QMessageBox::Ok);
ui->lineEdit->setText("");
ui->lineEdit->setFocus();
return;
}
if(text.at(2) == '.')
{
QMessageBox::information(this, "Info", "Range should be between 60 and 150.", QMessageBox::Ok);
ui->lineEdit->setText("");
ui->lineEdit->setFocus();
return;
}
if ((text.size() >= 3) && (text.toFloat() > 150 || text.toFloat() < 60))
{
QMessageBox::information(this, "Info", "Range should be between 60 and 150.", QMessageBox::Ok);
ui->lineEdit->setText("");
ui->lineEdit->setFocus();
return;
}
else
{
ui->lineEdit->setText(text);
}
}
void MyWidget::on_lineEdit_editingFinished()
{
QString text = ui->lineEdit->text();
if (text.toFloat() < 60)
{
QMessageBox::information(this, "Info", "Range should be between 60 and 150.", QMessageBox::Ok);
ui->lineEdit->setText("");
ui->lineEdit->setFocus();
}
else
{
ui->lineEdit->setText(text);
}
}