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

时间:2012-09-04 14:30:38

标签: qt range qslider qspinbox

我创建了一个矢量v,其中包含从-3000到3000的128个元素,我想将它与QDoubleSpinBoxQSlider相关联,因为将6000分为128并设置{{1我们总是有问题。那么我们可以使用这样的向量将范围和步长设置为QDoubleSpinBoxQDoubleSpinBox吗?

QSlider

2 个答案:

答案 0 :(得分:2)

QSlider仅按int步进行操作,因此您只需自己进行计算:

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

或者我不理解你的问题?

答案 1 :(得分: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);

但不包含只占整数的QSlider。您可以通过将范围乘以1000来避免舍入误差。

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

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