2012-02-22 22 views
0

我在將值輸入QLineEdit時遇到問題。這更符合邏輯問題。我的要求是,我想要限制用戶輸入60到150之間的值,包括該範圍內的十進制值,即65.5或140.5等。如果輸入的值超出此範圍,我想向用戶顯示消息。在Qt中輸入特定數據到QLineEdit時發生問題

我的方法是這樣的:我在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()> = 3)[/ B]。消息僅在text.size()> = 3時顯示。我無法爲此情況設置正確的邏輯。是否可以更改邏輯以顯示用戶滿足的範圍。 請讓我知道。 謝謝。

+0

我會認爲它非常破碎和令人討厭的UI,如果消息框彈出在我的臉上,因爲我鍵入。更好地顯示警告標籤和/或禁用確認按鈕和/或使用QDoubleValidator防止無效輸入。或者使用QDoubleSpinBox。 – 2012-02-22 18:19:44

回答

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

請試試這些代碼爲您的問題。

+0

它不按照要求工作。當你只輸入2位數時,它顯示信息,即當你輸入數字11時,顯示信息,這是不期望的,因爲用戶可能試圖輸入數字112. – user1182217 2012-02-22 10:59:49

+0

如果你連接到textChanged信號,測試將每次發射用戶改變文字。例如從'1'到'11'。如果您只想在用戶完成輸入文本時觸發測試,則可以連接到textEdited信號。 – 2012-02-22 13:06:47

+0

它可以在我的電腦上工作。也許有些錯誤不會發生在我的測試用例中,我會修改它,謝謝! – 2012-02-22 13:43:56

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

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