2012-09-04 26 views
1

我創建了一個具有從-3000到3000的128個元素的矢量v,我想將它與QDoubleSpinBoxQSlider相關聯,因爲將6000除以128並設置QDoubleSpinBox我們總是有問題。那麼我們可以使用這樣的矢量將範圍和步長設置爲QDoubleSpinBoxQSlider使用創建的矢量作爲QDoubleSpinBox和QSlider的範圍

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

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

這是不明顯的,你試圖實現。 「QDoubleSpinBox」和「QSlider」代表什麼,它們是如何相互關聯的? – cmannett85

回答

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" 

還是我不理解你的問題?

+0

我想就是這樣,我會試試看。謝謝你。 – SamuelNLP

+0

問題將出現在編輯QSpinBox時,我在那裏放入一個不在128位數字中的數字。 – SamuelNLP

+0

是的,您必須在其中設置某種模糊邏輯,以便在相同範圍內不更改旋轉框。我編輯了我的代碼來支持它。 –

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當然來劃分。

+0

我想要一個有128個元素的矢量,所以0也是重要的。 – SamuelNLP

+0

如果你想要一個具有128個元素的矢量,並且在矢量中同時具有-3000和+3000,那麼你將6000除以127而不是128,並且你的步長是47.244094488188976377952755905512,這意味着乘以1000將不起作用。 –

+0

這是我的問題。這就是爲什麼使用矢量而不是步長來解決我的問題的原因,但是因爲無法使用它。 – SamuelNLP