我已经创建了一个包含128个元素的向量v,从-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;
}发布于 2012-09-05 01:13:41
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"还是我没听懂你的问题?
发布于 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来做到这一点
QDoubleSpinBox::setRange(-3000.0,3000.0);
QDoubleSpinBox::setSingleStep(48.875);但不能使用QSlider,因为它只接受整数。您可以通过将范围乘以1000来避免舍入误差。
QSlider::setRange(-3000000,3000000);
QSlider::setSingleStep(48875);当然,要将选定结果设置为旋转框,您需要再次除以1000。
https://stackoverflow.com/questions/12265684
复制相似问题