2013-08-05 3 views
2

Я хочу перехватить QPaintEvent на QSlider и нарисовать его. Но я не могу найти детали геометрии вещи. Я могу знать прямоугольник() для всего виджета, но как вы можете определить положение первого тиккера или последнего в прямоугольнике виджета? (есть маржа слева и справа от канала отслеживания). Или прямоугольник «ручки»?Пользовательский рисунок QSlider (Qt)

ответ

5

Спасибо за подсказки в ответах. После некоторого расследования это, похоже, работает. В случае, если оно использования к кому:

QStyleOptionSlider opt; 
slider->initStyleOption(&opt); 

QStyle *styl=style(); 
Rect rectHandle=styl->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, NULL); 
Rect rectGroove=styl->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, NULL); 

int avl=styl->pixelMetric(QStyle::PM_SliderSpaceAvailable, &opt, this); // width in an horizontal slider of the groove (width of widget - margins) 
1

Вы уверены, что хотите переопределить событие рисования?
Может быть, этого будет достаточно, чтобы создать специальную таблицу стилей?
Вот пример для QSlider из DOKS:

QSlider::groove:horizontal { 
    border: 1px solid #999999; 
    height: 8px; /* the groove expands to the size of the slider by default. by giving it a height, it has a fixed size */ 
    background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #B1B1B1, stop:1 #c4c4c4); 
    margin: 2px 0; 
} 

QSlider::handle:horizontal { 
    background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #b4b4b4, stop:1 #8f8f8f); 
    border: 1px solid #5c5c5c; 
    width: 18px; 
    margin: -2px 0; /* handle is placed by default on the contents rect of the groove. Expand outside the groove */ 
    border-radius: 3px; 
} 
+0

Спасибо, на самом деле это проще для меня, чтобы перехватить QPaint и дополнительно я хотел динамически сделать это, если другие значения изменяются перерисовывать фон (контекст является цветовое определение HSL, каждый слайдер окрашивает доступную гамму в зависимости от других значений) – Joan

1

Рассматривали ли вы с помощью setStyleSheet вместо этого? Если вы действительно хотите сделать это самостоятельно, вы можете посмотреть, как это делается в исходном коде Qt: qt/src/gui/widgets/qslider.cpp

+0

Спасибо за подсказку об источнике, оттуда и некоторые тесты, я мог найти все, что мне было нужно. – Joan