2012-03-21 10 views
2

Qt 대화 상자가 있고 슬라이더가있는 경우 대화 상자가 초기화되면 슬라이더에 값이 설정됩니다. 사용자에게 기본 값을 상기시키기 위해 슬라이더에 표시를 추가하고 핸들 위에 선 또는 삼각형을 그립니다. 여기서 슬라이더는 QSlider 유형이어야합니다. 즉, QSlider에서 파생 된 사용자 정의 컨트롤을 구현할 수 없습니다. 그것을 실현할 방법이 있습니까?슬라이더에 눈금을 추가하는 방법 QSlider를 상속받을 수없는 경우

+0

당신은 슬라이더 범위를 따라 어딘가에 위치 핸들을 의미하지만 일부 그리기하여 다른 위치를 강조하고 싶은 마커 같은 거? – Masci

+0

@Masci : 슬라이더의 기본값을 강조하고 싶습니다. 사용자가 핸들을 끌면 초기 값 표시가 있기 때문에 여전히 슬라이더의 원래 값을 볼 수 있습니다. – Royt

+0

좋아요, 이제는 분명합니다 – Masci

답변

5

나는 명확하지 않다. 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

0

공용 메서드에 액세스하기 위해 QSlider를 상속해야하는 이유는 무엇입니까?

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

당신은 호출 할 수의 앱에서 setTickPosition()을. 내가 떨어져 생각할 수

+0

죄송합니다. 제 질문을 명확하게 표현하지 않았습니다. 예를 들어, 슬라이더의 값이 30 인 경우, 30 위치에 표시가 있습니다. – Royt

2

가장 쉬운 방법은 다음과 같습니다 (당신이 레이아웃과 QFrames와 함께 할 것처럼)

이 QSlider에 QSlider를 추가합니다. 위의 슬라이더는 현재 슬라이더입니다 (클릭 가능한 슬라이더). 아래의 슬라이더가 "기본 눈금 위치"값이됩니다. 당신이 QSlider에서 컨트롤을 파생 할 수없는 이유

#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