1

我创建了一个向量 v ,其中包含从 -3000 到 3000 的 128 个元素,我想将它与 aQDoubleSpinBox和 a相关联QSlider,因为将 6000 划分为 128 并设置QDoubleSpinBox我们总是有圆形问题。那么我们可以将范围和步长都设置为 aQDoubleSpinBoxQSlider这样的向量吗?

  std::vector<double> v(128);

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

2 回答 2

2

QSliderint按步骤操作,因此您只需要自己进行计算:

#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"

还是我不明白你的问题?

于 2012-09-04T17:13:41.443 回答
0

首先,您的向量计算中有一个错误。如果要将范围划分为 X 部分,则向量的大小必须为 X+1 而不是 X。示例:您要将范围 0-10 拆分为 5 个部分。您需要多少物品?您的代码建议 5。但答案是 [0,2,4,6,8,10] = 6。所以有向量 129 并除以 128。

因此,您希望步长为 6000/128 = 48.875。你可以这样做QDoubleSpinBox

QDoubleSpinBox::setRange(-3000.0,3000.0);
QDoubleSpinBox::setSingleStep(48.875);

但不是 with QSliderwhich 只需要整数。您可以通过将范围乘以 1000 来避免舍入误差。

QSlider::setRange(-3000000,3000000);
QSlider::setSingleStep(48875);

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

于 2012-09-04T20:20:36.417 回答