我希望對使用 QDoubleValidator 所面臨的問題有所了解,我創建了一個小部件來收集一些資訊,并希望將一些欄位驗證為 Double 值,我在這里這樣做了:
orderform::orderform(QWidget *parent) :
QDialog(parent),
ui(new Ui::orderform)
{
ui->setupUi(this);
this->setWindowTitle("Order Entry / Edt");
ui->edtOrderDate->setDate(QDate::currentDate()); //Sets date box to current date
//----- Validator for float input in 'money' fields -----//
auto dv = new QDoubleValidator(0.0,5.0,2);
ui->edtSoldFor->setValidator(dv);
ui->edtItemSubtotal->setValidator(dv);
ui->edtShipping->setValidator(dv);
ui->edtSalesTaxPFC->setValidator(dv);
ui->edtDiscount->setValidator(dv);
ui->edtOrderTotal->setValidator(dv);
ui->edtTotalFee->setValidator(dv);
ui->edtVAT->setValidator(dv);
ui->edtFeeIncVAT->setValidator(dv);
ui->edtBoughtFor->setValidator(dv);
ui->edtSupSubTotal->setValidator(dv);
ui->edtSupShipping->setValidator(dv);
ui->edtSupTax->setValidator(dv);
ui->edtSupOrderTotal->setValidator(dv);
ui->edtAddExpense->setValidator(dv);
ui->edtAddDiscount->setValidator(dv);
//----- -----//
}
此外,這些欄位中的每一個都有一個分配給它們的插槽,以便在編輯欄位完成時運行計算,這是一個示例:
void orderform::on_edtSoldFor_editingFinished()
{
calcPltfrmOrderTotals();
}
這是它呼叫的函式:
void orderform::calcPltfrmOrderTotals() //This function is used to calculate all totals
{
//Var:
double valueAsDouble = 0;
QString valueAsString;
//Calc Order Sub Total
valueAsDouble = (ui->edtBoughtFor->text().toDouble() * ui->sbSupQty->value());
valueAsString = QString::number(valueAsDouble);
ui->edtSupSubTotal->setText(valueAsString);
//Calc Supplier Sub Total
valueAsDouble = (ui->edtSoldFor->text().toDouble() * ui->sbItemQty->value());
valueAsString = QString::number(valueAsDouble);
ui->edtItemSubtotal->setText(valueAsString);
//Calc Order Total on platform
valueAsDouble = ((ui->edtItemSubtotal->text().toDouble() ui->edtShipping->text().toDouble() ui->edtSalesTaxPFC->text().toDouble()) - ui->edtDiscount->text().toDouble());
valueAsString = QString::number(valueAsDouble);
ui->edtOrderTotal->setText(valueAsString);
//Calc fee total on platform
valueAsDouble = (ui->edtTotalFee->text().toDouble() ui->edtVAT->text().toDouble());
valueAsString = QString::number(valueAsDouble);
ui->edtFeeIncVAT->setText(valueAsString);
//Calc Supplier Order Total
valueAsDouble = (ui->edtSupSubTotal->text().toDouble() ui->edtSupShipping->text().toDouble() ui->edtSupTax->text().toDouble());
valueAsString = QString::number(valueAsDouble);
ui->edtSupOrderTotal->setText(valueAsString);
//Calc PNL
valueAsDouble = (((ui->edtItemSubtotal->text().toDouble() - ui->edtFeeIncVAT->text().toDouble()) - ui->edtSupOrderTotal->text().toDouble())
- ui->edtAddExpense->text().toDouble()) ui->edtAddDiscount->text().toDouble();
valueAsString = QString::number(valueAsDouble);
ui->lcdPNL->display(valueAsDouble);
};
問題是在我將驗證添加到欄位之前,計算將在編輯完成后立即正確運行,但是一旦我添加驗證,“editfinish”上的計算就會非常順利,有時它會起作用,有時它會作業它沒有,我不知道為什么。
uj5u.com熱心網友回復:
也許您的驗證器范圍(0.0 到 5.0)太窄了。如果新計算的值超出范圍,驗證器狀態將不再存在QValidator::Acceptable,并且作為副作用,行編輯將不再發出editingFinished信號。
您可以嘗試將驗證器保持top()為其默認(無窮大)值,也許使用其他建構式并使用 setter 設定小數和范圍底部:
auto dv = new QDoubleValidator();
dv->setDecimals(2);
dv->setBottom(0.0);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/409020.html
標籤:
