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