2012-01-09 39 views
5

Tôi muốn kết nối một QSlider đến một QDoubleSpinBox nhưng trong khi các mã biên dịch tốt và chạy cho QSpinBox đơn giản, nó không làm việc cho QDoubleSpinBoxLàm thế nào để kết nối một QSlider để QDoubleSpinBox

QSlider *horizontalSlider1 = new QSlider(); 
QDoubleSpinBox *spinBox1 = new QDoubleSpinBox(); 

connect(spinBox1, SIGNAL(valueChanged(double)),horizontalSlider1,SLOT(setValue(double))); 
connect(horizontalSlider1,SIGNAL(valueChanged(double)),spinBox1,SLOT(setValue(double))); 

Trả lời

6

QSlider và QDoubleSpinBox mất khác nhau các loại đối số trong valueChanged/setValue (QSlider sử dụng ints và QDoubleSpinBox sử dụng đôi, tất nhiên). Thay đổi kiểu lập luận cho tín hiệu của thanh trượt và khe cắm có thể giúp:

connect(spinBox1, SIGNAL(valueChanged(double)),horizontalSlider1,SLOT(setValue(int))); 
connect(horizontalSlider1,SIGNAL(valueChanged(int)),spinBox1,SLOT(setValue(double))); 

Tôi không chắc chắn nếu Qt có thể tự động xử lý các loại chuyển đổi này cho bạn; nếu không, bạn sẽ phải xác định vị trí của riêng bạn để gọi setValue() trên đối tượng chính xác

+1

Không, không thể chuyển đổi hợp lý có ý nghĩa cả hai cách (thanh trượt-> hộp kéo, hộp xoay-> thanh trượt). Nó sẽ cần các khe tùy chỉnh để ánh xạ chính xác các giá trị. –

7

Bạn sẽ phải thêm khe của riêng bạn để chuyển đổi loại đối số và phát ra tín hiệu hoặc cập nhật thanh trượt trực tiếp.

+0

Cảm ơn, tôi sẽ cố gắng, nhưng có vẻ lạ mà chưa ai thực hiện nó ... Tôi nghĩ đó là một điều rất phổ biến ... – linello

3

Khi Dave Kilian trả lời, các tín hiệu và khe cắm cho QSlider không sử dụng gấp đôi. Ngoài ra, Qt 4 không tự động chuyển đổi các loại; nó sẽ không cho phép bạn kết nối chúng. Vì vậy, bạn sẽ phải viết khe chuyển đổi của riêng bạn để cập nhật giá trị của mục khác.

1

Hy vọng điều này có thể giúp bạn.

#include <QApplication> 
#include <QtGui> 
#include <QVBoxLayout> 
#include <QSlider> 
#include <QLabel> 

class DoubleSlider : public QSlider { 
    Q_OBJECT 

public: 
    DoubleSlider(QWidget *parent = 0) : QSlider(parent) { 
     connect(this, SIGNAL(valueChanged(int)), 
      this, SLOT(notifyValueChanged(int))); 
    } 

signals: 
    void doubleValueChanged(double value); 

public slots: 
    void notifyValueChanged(int value) { 
     double doubleValue = value/10.0; 
     emit doubleValueChanged(doubleValue); 
    } 
}; 

class Test : public QWidget { 
    Q_OBJECT 
public: 
    Test(QWidget *parent = 0) : QWidget(parent), 
     m_slider(new DoubleSlider()), 
     m_label(new QLabel()) 
    { 
     m_slider->setOrientation(Qt::Horizontal); 
     m_slider->setRange(0, 100); 
     QVBoxLayout *layout = new QVBoxLayout(this); 
     layout->addWidget(m_slider); 
     layout->addWidget(m_label); 
     connect(m_slider, SIGNAL(doubleValueChanged(double)), 
      this, SLOT(updateLabelValue(double))); 
     updateLabelValue(m_slider->value()); 
    } 

public slots: 
    void updateLabelValue(double value) { 
     m_label->setText(QString::number(value, 'f', 2)); 
    } 

private: 
    QSlider *m_slider; 
    QLabel *m_label; 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    Test *wid = new Test(); 
    wid->show(); 

    return a.exec(); 
} 

#include "main.moc" 
Các vấn đề liên quan