2012-03-21 55 views
2

我有一個Qt對話框,並有一個滑塊,當對話框初始化時,滑塊將被設置一個值。爲了提醒用戶什麼是默認值,我想添加一個標記到滑塊,只需在手柄上方畫一條線或一個三角形即可。這裏,滑塊應該是QSlider類型,這意味着我不能實現從QSlider派生的定製控件。有什麼辦法可以實現它嗎?如何將一個刻度線添加到滑塊,如果它不能繼承QSlider

+0

你的意思是手柄沿滑塊範圍的某處,但你想畫些強調的另一個位置一種標記? – Masci 2012-03-21 10:46:44

+0

@Masci:我想強調滑塊的默認值,當用戶拖動手柄時,他們仍然可以看到滑塊的原始值,因爲有初始值的標記。 – Royt 2012-03-21 10:55:52

+0

好的,現在很清楚 – Masci 2012-03-21 10:58:23

回答

5

我不清楚爲什麼你不能從QSlider得到控制。您仍然可以將其視爲QSlider,只需覆蓋paintEvent方法即可。下面的例子是非常不好的,視覺上說,但你可以使用從QStyle方法,使它看起來更自然:

#include <QtGui> 

class DefaultValueSlider : public QSlider { 
    Q_OBJECT 

public: 
    DefaultValueSlider(Qt::Orientation orientation, QWidget *parent = NULL) 
    : QSlider(orientation, parent), 
     default_value_(-1) { 
    connect(this, SIGNAL(valueChanged(int)), SLOT(VerifyDefaultValue(int))); 
    } 

protected: 
    void paintEvent(QPaintEvent *ev) { 
    int position = QStyle::sliderPositionFromValue(minimum(), 
                maximum(), 
                default_value_, 
                width()); 
    QPainter painter(this); 
    painter.drawLine(position, 0, position, height()); 
    QSlider::paintEvent(ev); 
    } 

private slots: 
    void VerifyDefaultValue(int value){ 
    if (default_value_ == -1) { 
     default_value_ = value; 
     update(); 
    } 
    } 

private: 
    int default_value_; 
}; 

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

    DefaultValueSlider *slider = new DefaultValueSlider(Qt::Horizontal); 
    slider->setValue(30); 

    QWidget *w = new QWidget; 
    QVBoxLayout *layout = new QVBoxLayout; 
    layout->addWidget(slider); 
    layout->addStretch(1); 
    w->setLayout(layout); 

    QMainWindow window; 
    window.setCentralWidget(w); 
    window.show(); 

    return app.exec(); 
} 

#include "main.moc" 
+0

感謝提及'QStyle :: sliderPositionFromValue' – Micka 2014-10-09 13:08:14

0

爲什麼你需要繼承一個QSlider來訪問它的公共方法?

http://doc.trolltech.com/4.7/qslider.html

您可以直接調用它在你的應用setTickPosition()。我能想到

+0

抱歉,我沒有清楚地表達我的問題。我的意思是,例如,如果滑塊的值是30,那麼在位置30處只有一個標記。 – Royt 2012-03-21 10:45:54

2

最簡單方法是:

添加QSlider到QSlider(像你這樣的佈局和QFrames做到這一點)。上面的滑塊將是您當前的滑塊(可點擊其中一個)。下面的滑塊將成爲您的「默認滴答位置」值。

#include <QApplication> 
#include <QSlider> 
#include <QVBoxLayout> 

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

    QSlider * defaultValueSlider = new QSlider(); 
    QSlider * valueSlider = new QSlider(defaultValueSlider); 
    QVBoxLayout * lay = new QVBoxLayout(defaultValueSlider); 
    lay->setContentsMargins(0, 0, 0, 0); 
    lay->setSpacing(0); 
    lay->addWidget(valueSlider); 
    defaultValueSlider->setRange(0, 100); 
    valueSlider->setRange(0, 100); 
    defaultValueSlider->setValue(30); 

    defaultValueSlider->show(); 

    return app.exec(); 
} 

result

相關問題