在Qt中向QLineEdit输入特定数据时发出问题

时间:2012-02-22 09:14:59

标签: qt

我在向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时才显示消息。我无法为此案例提供正确的逻辑。是否可以更改逻辑以显示要满足范围的用户。 请告诉我。 感谢。

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);
    }
}