2012-03-21 3 views
2

У меня есть диалог Qt, и в нем есть ползунок, когда диалог инициализируется, ползунку будет задано значение. Чтобы напомнить пользователю, что такое значение по умолчанию, я хочу добавить метку в слайдер, просто нарисуйте линию или треугольник над дескриптором. Здесь ползунок должен быть типа QSlider, это означает, что я не могу реализовать настраиваемый элемент управления, полученный из QSlider. Есть ли способ понять это?Как добавить галочку на слайдер, если он не может наследовать QSlider

+0

Вы имеете в виду, что ручка расположена где-то вдоль диапазона слайдера, но вы хотите, чтобы подчеркнуть другую позицию, привлекая некоторые вид маркера? – Masci

+0

@Masci: Я хочу подчеркнуть значение по умолчанию слайдера, когда пользователь перетаскивает дескриптор, они все еще могут видеть исходное значение слайдера, поскольку есть отметка для начального значения. – Royt

+0

ОК, теперь ясно – Masci

ответ

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

0

Почему вам нужно наследовать QSlider для доступа к его общедоступным методам?

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

Вы можете просто позвонить его setTickPosition() в вашем приложении.

+0

Извините, я не ясно изложил свой вопрос. Я имею в виду, например, если значение ползунка равно 30, есть только отметка в позиции 30. – Royt

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

 Смежные вопросы

  • Нет связанных вопросов^_^