首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用创建的向量作为QDoubleSpinBox和QSlider的范围

使用创建的向量作为QDoubleSpinBox和QSlider的范围
EN

Stack Overflow用户
提问于 2012-09-04 22:30:38
回答 2查看 2.7K关注 0票数 1

我已经创建了一个包含128个元素的向量v,从-3000到3000,我想将它与一个QDoubleSpinBox和一个QSlider关联起来,因为将6000除以128并设置QDoubleSpinBox总是存在舍入问题。那么我们可以使用这样的向量将范围和步长都设置为QDoubleSpinBoxQSlider吗?

代码语言:javascript
复制
  std::vector<double> v(128);

  for (int i = 0; i < 128; ++i)
  {
      v[i] = -3000.0 + 6000.0 * (i) / 127.0;
  }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-05 01:13:41

QSlider只使用int步骤进行操作,因此您只需要自己计算:

代码语言:javascript
复制
#include <QtGui>
#include <cmath>

class MyWidget : public QWidget {
  Q_OBJECT

public:
  MyWidget() : QWidget() {
    slider_ = new QSlider;
    slider_->setRange(0, 127);
    connect(slider_, SIGNAL(valueChanged(int)), SLOT(ChangeSpinBox(int)));

    box_ = new QDoubleSpinBox;
    box_->setRange(-3000.0, 3000.0);
    connect(box_, SIGNAL(valueChanged(double)), SLOT(ChangeSlider(double)));

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(slider_);
    layout->addWidget(box_);

    setLayout(layout);
  }
private slots:
  void ChangeSpinBox(int sliderValue) {
    if (convertSpinBoxValueToSlider(box_->value()) != sliderValue) {
        box_->setValue((6000.0 * sliderValue / 127.0) - 3000.0);
    }
  }

  void ChangeSlider(double spinBoxValue) {
    slider_->setValue(convertSpinBoxValueToSlider(spinBoxValue));
  }

private:
  QSlider *slider_;
  QDoubleSpinBox *box_;

  static int convertSpinBoxValueToSlider(double value) {
    return qRound((value + 3000.0) * 127.0 / 6000.0);
  }

};

int main(int argc, char **argv) {
  QApplication app(argc, argv);
  MyWidget w;
  w.show();
  return app.exec();
}

#include "main.moc"

还是我没听懂你的问题?

票数 2
EN

Stack Overflow用户

发布于 2012-09-05 04:20:36

首先,您的向量计算中有一个bug。如果你想把一个范围分成X个部分,那么你的向量的大小必须是X+1而不是X。例如:你想把范围0-10分成5个部分。你需要几样东西?你的代码是5,但答案是0,2,4, 6 ,8,10 =6,所以有向量129,除以128。

所以你希望步长为6,000/128= 48.875。您可以使用QDoubleSpinBox来做到这一点

代码语言:javascript
复制
QDoubleSpinBox::setRange(-3000.0,3000.0);
QDoubleSpinBox::setSingleStep(48.875);

但不能使用QSlider,因为它只接受整数。您可以通过将范围乘以1000来避免舍入误差。

代码语言:javascript
复制
QSlider::setRange(-3000000,3000000);
QSlider::setSingleStep(48875);

当然,要将选定结果设置为旋转框,您需要再次除以1000。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12265684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档