如何允许QSpinBox在装满时插入

How to allow QSpinBox to insert when full?

本文关键字:满时 插入 何允许 QSpinBox      更新时间:2023-10-16

我尝试过以各种方式搜索这个问题,但没有找到任何相关的东西,所以也许有一种简单的方法可以解决这个问题,我根本没有找到。如果是,我提前道歉。

我在我的应用程序中使用了许多QSpinBoxes,它们的行为让我感到非常沮丧,也就是说,如果你插入光标并尝试键入,它会被阻止,并且什么都没有插入。如果我删除一个字符,那么我可以键入一个字符等等

示例:

Spinbox显示:0.0000

我将光标插入"."之后并且想要键入"5",即它将具有0.50000。考虑到我在限制和精度方面设置的约束,这是被阻止的,因为旋转框已满。我必须按Delete删除一个"0",所以它显示0.000,然后我可以键入我的"5"。

如何让spinbox在输入时接受所有有效的输入,而只担心在最后截断值?

您可能可以将QDdoubleSpinBox子类化,并重新实现其验证方法,以允许使用更多小数点的数字。

然后捕获editingFinished信号以截断输入的值。

正如在另一个问题中提到的,我认为只有一种方法可以通过重写QDoubleSpinBox::validate类来实现这一点。

示例实现:

QValidator::State DoubleSpinBox::validate(QString& input, int& pos) const
{
    //support prefix & suffix
    const int decimalPointIndex = input.indexOf(locale().decimalPoint());
    if(decimalPointIndex != -1 && decimalPointIndex < pos)
    {
        //Find last not digit
        const auto lastNotDigitIt =
            std::find_if_not(input.begin() + decimalPointIndex + 1,
                             input.end(),
                             [](const auto& item) { return item.isDigit(); });
        const int lastNotDigitIndex = std::distance(input.begin(), lastNotDigitIt);
        //Check should we trim input to desired decimals
        const int extraDigits = (lastNotDigitIndex - 1 - decimalPointIndex) - decimals();
        if(extraDigits > 0 && lastNotDigitIndex != decimalPointIndex)
        {
            QString copy = input;
            //trim
            input.erase(lastNotDigitIt - extraDigits, lastNotDigitIt);
        }
    }
    return QDoubleSpinBox::validate(input, pos);
}

若你们需要在Designer工具中使用这样的类,你们只需要提升你们的小部件。(相当简单)