如何在 QDoubleSpinBox 中为单步设置多个值

Posted

技术标签:

【中文标题】如何在 QDoubleSpinBox 中为单步设置多个值【英文标题】:How to have multiple values for single step in QDoubleSpinBox 【发布时间】:2019-11-24 12:46:36 【问题描述】:

我正在使用单步值为 1.0 的 QT QDouleSpinBox

当我改变值时,它每增加 1 次。

当我按住 Control 键并更改值时,每次增量为 10.0

现在我想添加 Alt 键并将每个增量更改 0.1,我该怎么做?

我正在尝试使用此类在 QT 设计器中推广 QDoubleSpinBox 小部件。

stepBy函数如何实现?

#pragma once
#include< QDoubleSpinBox>

class spinboxsumit : public  QDoubleSpinBox

    Q_OBJECT
public:
    spinboxsumit(QWidget * parent = 0);
    void stepBy(double steps);

;

/////////////////////////////////////////////////////////////////////////////////////////////////

#include "spinboxsumit.h"
spinboxsumit::spinboxsumit(QWidget * parent) : QDoubleSpinBox( parent)





void spinboxsumit::stepBy(double steps)




【问题讨论】:

【参考方案1】:

好问题。鉴于可用修饰键的数量,更灵活的东西会很好!没有什么“内置”的。我看到您正在尝试重新实现自定义版本...这也是我的想法。

这是我能想到的(几乎)最简单的版本。顺便说一句,ALT 修饰符对我(Win7)和鼠标滚轮由于某种原因不起作用(根本没有调整,即使使用“库存”旋转框),所以我在这里使用 SHIFT 作为测试的修饰符。 (不知道为什么 Alt+wheel 不起作用,可能是我的系统。)

#include <QDoubleSpinBox>
#include <QApplication>

class DoubleBox : public QDoubleSpinBox

  Q_OBJECT
  public:
    using QDoubleSpinBox::QDoubleSpinBox;  // inherit c'tors

    // re-implement to keep track of default step (optional, could hard-code step in stepBy())
    void setSingleStep(double val)
    
      m_defaultStep = val;
      QDoubleSpinBox::setSingleStep(val);
    

    // override to adjust step size
    void stepBy(int steps) override
    
      // set the actual step size here
      double newStep = m_defaultStep;
      if (QApplication::queryKeyboardModifiers() & Qt::ShiftModifier)
        newStep *= 0.1;
      // be sure to call the base setSingleStep() here to not change m_defaultStep.
      QDoubleSpinBox::setSingleStep(newStep);
      QDoubleSpinBox::stepBy(steps);
    

  private:
    double m_defaultStep = 1.0;
;

还有一个快速测试:

int main(int argc, char *argv[])

  QApplication a(argc, argv);
  QDialog d;
  d.setLayout(new QVBoxLayout);
  d.layout()->addWidget(new DoubleBox(&d));
  return d.exec();

#include "main.moc"

更进一步,可以重新实现更完整的stepBy(int) (current source) 版本,或者通过重新实现wheel/key 事件在较低级别上实现。

【讨论】:

以上是关于如何在 QDoubleSpinBox 中为单步设置多个值的主要内容,如果未能解决你的问题,请参考以下文章

matlab编程如何设置断点、如何单步调试、如何提高程序运行速度

如何从 facebook/google/... oauth2 身份验证在 Spring (Boot) 中为单页应用程序派生自定义登录令牌?

如何在 ExtJS4 中为单例添加方法?

如何更改 QDoubleSpinbox 的文本格式?

如何禁用 QDoubleSpinBox 中的向上/向下按钮

QDoubleSpinBox:停止发射中间值