QT 中 QDoubleSpinBoxes 的多个范围

Posted

技术标签:

【中文标题】QT 中 QDoubleSpinBoxes 的多个范围【英文标题】:Multiple ranges for QDoubleSpinBoxes in QT 【发布时间】:2019-04-13 15:46:45 【问题描述】:

我正在构建一个使用多个频率范围的应用程序。我需要用户能够增加/减少QDoubleSpinBox 中的值,以及输入值。如果我将值增加到一个范围之外的数字,我希望该值跳到下一个范围(减小值的原理相同)。

QDoubleSpinBox 是否提供这种行为?我似乎无法找到我正在寻找的答案。我尝试使用QDoubleValidator 设置范围,但我认为它不支持多个范围(除非我遗漏了什么)。我也尝试过使用带有 valueChanged() 信号的 if 语句进行范围检查,但必须有更简单的方法,对吧?

这是我希望 doubleSpinBox 表现的示例:

起始值:9.75

范围 1:9.75 - 9.95

范围 2:10.15 - 10.40

范围 3:17.2 - 20.4

如果值高于 9.95,则跳转到 10.15。

如果值超过 10.40,则跳转到 17.2,等等。

我也希望在减小值时具有相同的行为(如果值低于 10.15,则跳回 范围 1)。

如果可以避免的话,我希望不写多个if/else if 语句。

【问题讨论】:

您可以随时关注当前值是多少,并在适当的情况下跳转到下一个范围。 spinbox 与此无关,它只是显示当前值。 【参考方案1】:

尝试创建多个范围并不是一个好的解决方案。您应该以不同的方式考虑您的问题:您有一个从 9.75 到 20.40 的单一范围,其中包含禁止值。

因此,如果您覆盖 QDoubleSpinBox::stepsBy()QDoubleSpinBox::valueFromText() 等方法,您将能够丢弃范围之外的值:

class Spinbox: public QDoubleSpinBox

public:
    Spinbox(): QDoubleSpinBox()
    
        setRange(9.75, 20.4);
        setSingleStep(0.1);
    

    virtual void stepBy(int steps) override
    
        double const newValue = checkValue(value() + (steps * singleStep()));
        setValue(newValue);
    

    virtual double valueFromText(QString const& text) const override
    
        qDebug() << text;
        double const newValue = QDoubleSpinBox::valueFromText(text);
        return checkValue(newValue);
    

    double checkValue(double newValue) const
    
        qDebug() << newValue << value();
        if (9.95 < newValue && newValue < 10.15)
        
                if (newValue > value())
                    return 10.15;
                else
                    return 9.95;
        
        else if (10.4 < newValue && newValue < 17.2)
        
            if (newValue > value())
                return 17.2;
            else
                return 10.4;
        
        return newValue;
    
;

【讨论】:

我什至没有这么想过,这让事情变得简单多了!

以上是关于QT 中 QDoubleSpinBoxes 的多个范围的主要内容,如果未能解决你的问题,请参考以下文章

qt中.pro文件调用多个makefile文件

在多个 qt 线程中使用单个 QSqlDatabase 连接

为啥多个文件可以在 Qt .qrc 中使用相同的别名?

QT:使用 QMouseEvent 从代码中选择多个 QTableWidgetItem

Qt:如何在模型/视图设置中同步对来自多个线程的数据的访问?

qt多个工程之间调用