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

Qt 使用创建的向量作为QDoubleSpinBox和QSlider的范围,qt,range,qslider,qspinbox,Qt,Range,Qslider,Qspinbox,我创建了一个向量v,其中128个元素从-3000到3000,我想将它与QDoubleSpinBox和QSlider相关联,因为将6000除以128并设置QDoubleSpinBox我们总是有一个圆的问题。那么,我们可以用这样的向量将范围和步长设置为QDoubleSpinBox和QSlider std::vector<double> v(128); for (int i = 0; i < 128; ++i) { v[i] = -3000.0 + 6000

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

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

  for (int i = 0; i < 128; ++i)
  {
      v[i] = -3000.0 + 6000.0 * (i) / 127.0;
  }
标准:向量v(128); 对于(int i=0;i<128;++i) { v[i]=-3000.0+6000.0*(i)/127.0; }
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"
#包括
#包括
类MyWidget:publicqwidget{
Q_对象
公众:
MyWidget():QWidget(){
滑块=新的QSlider;
滑块->设置范围(0,127);
连接(滑块、信号(值更改(int))、插槽(更改Spinbox(int));
盒子=新的QDoubleSpinBox;
框->设置范围(-3000.0,3000.0);
连接(盒),信号(值更改(双)),插槽(更改滑块(双));
QVBoxLayout*布局=新的QVBoxLayout;
布局->添加小部件(滑块);
布局->添加小部件(框);
设置布局(布局);
}
专用插槽:
void ChangeSpinBox(int sliderValue){
如果(convertSpinBoxValueToSlider(框->值())!=sliderValue){
框->设置值((6000.0*sliderValue/127.0)-3000.0);
}
}
void ChangeSlider(双spinBoxValue){
滑块->设置值(将spinBoxValue转换为滑块(spinBoxValue));
}
私人:
QSlider*滑块;
QDoubleSpinBox*box;
静态int convertSpinBoxValueToSlider(双值){
返回qRound((值+3000.0)*127.0/6000.0);
}
};
int main(int argc,字符**argv){
QApplication应用程序(argc、argv);
myw;
w、 show();
返回app.exec();
}
#包括“main.moc”

还是我不明白你的问题?

首先,你的向量计算有一个缺陷。如果要将一个范围划分为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);

要将所选结果设置为spinbox,您当然需要再次除以1000。

您想要达到的效果并不明显。
QDoubleSpinBox
QSlider
代表什么,它们之间的关系如何?我想就是这样,我试试看。谢谢你。问题是当编辑QSpinBox时,我放了一个不是向量上128个数字之一的数字。是的,你必须在那里设置某种模糊逻辑,如果自旋框的范围相同,就不改变它。我编辑了我的代码来支持它。我不明白一件事。Spinbox具有向上/向下箭头。在这个解决方案中,当步长超出双精度时,该如何工作?我想要一个包含128个元素的向量,因此0也会计算。如果你想要一个包含128个元素的向量,并且向量中同时包含-3000和+3000,然后你将6000除以127,而不是128,你的步长是47.244094488188976377952755905512,这意味着乘以1000不起作用。这是我的问题。这就是为什么使用向量而不是步长可以解决我的问题,但因为不可能使用一个。