c++ - QDoubleValidator 和 QLineEdit onEditFinished 冲突?

标签 c++ qt c++11

我希望深入了解我在使用 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”上的计算就很不稳定,有时它会起作用有时它不会,我不知道为什么。

最佳答案

也许您的验证器范围(0.0 到 5.0)太窄了。如果新计算的值超出范围,验证器状态将不再是 QValidator::Acceptable,并且作为副作用,行编辑将不再发出 editingFinished。信号。

您可以尝试将验证器的 top() 保持为其默认(无穷大)值,也许使用其他构造函数并使用 setter 来设置小数和范围底部:

auto dv = new QDoubleValidator();
dv->setDecimals(2);
dv->setBottom(0.0);

关于c++ - QDoubleValidator 和 QLineEdit onEditFinished 冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70674025/

相关文章:

c++ - 在从 std::vector 移动的对象上调用 .clear()、.shrink_to_fit()、.empty() 是否合法?

c++ - 在使用 GCC 4.8.5 构建的应用程序中未定义对 cxx11 函数的引用

c++ - 双继承类型推导

c++ - Crypto++ 无法构建 Qt 应用程序

qt - 调整 QML 图像显示大小

qt - 使 Qt 应用程序成为 RSS 提要的标准应用程序

c++ - 如何使用decltype判断加法结果

c++ - 在 Win32 C++ 中禁用单个应用程序的按钮动画

c - 如果您知道字符会在到达有效区域末尾之前找到,那么调用长度过长的 memchr 是否合法?

c++ - 在类方法内的lambda函数内调用类方法