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

在Qt中向QLineEdit输入特定数据时出现问题,qt,Qt,我在QLineEdit中输入值时遇到问题。这更符合逻辑。我的要求是,我希望限制用户输入60到150之间的值,包括此范围内的十进制值,即65.5或140.5等。如果用户输入的值超出此范围,我希望向用户显示一条消息 我的方法是:在ui设计器中将这个“QLineEdit”的“maxLength”属性设置为5,这样用户只能输入5个字符,比如140.5。然后在“textChanged”插槽中,我编写了以下代码: void MyWidget::on_lineEdit_textChanged(QString

我在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);
    }
}
上面的代码运行良好。唯一的问题是,当我检查条件[B](text.size()>=3)[/B]时,如果第一次执行时值小于60,则不会显示消息。仅当text.size()>=3时才显示消息。我无法为这个案件提出正确的逻辑。是否可以更改逻辑,以显示要满足范围的用户。 请让我知道。 谢谢。

void number\u test::Slot(const QString&str)
{
QString sttt=str;
bool bb=标准含水量(QChar('.');
if(!bb)
{
int nSize=sttt.size();
如果(nSize==1)
{
如果(sttt.toInt()<6&&sttt.toInt()!=1)
{
QMessageBox::information(这个“信息”,“范围应该在60到150之间”,QMessageBox::Ok);
清除();
}
}
否则如果(nSize==2)
{
if(sttt.toFloat()<60.0)
{
QMessageBox::information(这个“信息”,“范围应该在60到150之间”,QMessageBox::Ok);
清除();
}
}
否则,如果(nSize>=3)
{
如果(sttt.toFloat()>150.0)
{
QMessageBox::information(这个“信息”,“范围应该在60到150之间”,QMessageBox::Ok);
清除();
}
}
}
其他的
{
int nSize=sttt.size();
如果(nSize==1)
{
如果(sttt.toInt()<6&&sttt.toInt()!=1)
{
QMessageBox::information(这个“信息”,“范围应该在60到150之间”,QMessageBox::Ok);
清除();
}
}
其他的
{
如果(sttt.toFloat()>150.0 | | sttt.toFloat()<60.0)
{
QMessageBox::information(这个“信息”,“范围应该在60到150之间”,QMessageBox::Ok);
清除();
}
}
}
}

请为您的问题尝试这些代码。

这看起来像是QDoubleValidator的案例

编辑:如果您想让messagebox在无效文本上弹出,您可以使用您已经使用的插槽中的验证器

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也需要它。

这已经解决了。我实施了以下代码:

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);
    }
}
void MyWidget::on_lineEdit_textChanged(QString text)
{
if(text.startsWith('.'))
{
QMessageBox::information(这个“信息”,“范围应该在60到150之间”,QMessageBox::Ok);
ui->lineEdit->setText(“”);
ui->lineEdit->setFocus();
返回;
}
如果(文本在(2)='。)
{
QMessageBox::information(这个“信息”,“范围应该在60到150之间”,QMessageBox::Ok);
ui->lineEdit->setText(“”);
ui->lineEdit->setFocus();
返回;
}
如果((text.size()>=3)和(&(text.toFloat()>150 | | text.toFloat()<60))
{
QMessageBox::information(这个“信息”,“范围应该在60到150之间”,QMessageBox::Ok);
ui->lineEdit->setText(“”);
ui->lineEdit->setFocus();
返回;
}
其他的
{
ui->lineEdit->setText(文本);
}
}
void MyWidget::on_lineEdit_editingFinished()
{
QString text=ui->lineEdit->text();
if(text.toFloat()<60)
{
QMessageBox::information(这个“信息”,“范围应该在60到150之间”,QMessageBox::Ok);
ui->lineEdit->setText(“”);
ui->lineEdit->setFocus();
}
其他的
{
ui->lineEdit->setText(文本);
}
}

它没有按照要求工作。当您仅输入2位数字时,它会显示消息,即当您输入数字11时,它会显示消息,这不是预期的,因为用户可能试图输入数字,如112。如果您连接到文本更改信号,则每次用户更改文本时,测试都将启动。例如,从“1”到“11”。如果您希望测试仅在用户完成输入文本后启动,您可以连接到文本编辑信号。它可以在我的计算机中工作。可能我的测试用例中没有出现错误,我会修改它,谢谢!谢谢你,金姆。我实现了你的想法。当我输入时,如果消息框在我的脸上弹出,我会认为它是非常破碎和令人讨厌的UI。最好显示警告标签和/或禁用确认按钮和/或使用QDoubleValidator来防止无效输入。或者使用QDoubleSpinBox。
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);
      }
}
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);
    }
}