Пользовательский рисунок QSlider (Qt)
Я хочу перехватить QPaintEvent на QSlider и нарисовать его. Но я не могу найти детали по геометрии вещи. Я могу знать rect() всего виджета, но как определить положение первого или последнего тика в прямоугольнике виджета? (есть поле слева и справа от канала отслеживания). Или прямоугольник "ручки"?
3 ответа
Спасибо за подсказки в ответах. После некоторого расследования это, кажется, работает. Для случая, если это кому-то пригодится:
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)
Вы уверены, что хотите переопределить событие краски?
Может быть, этого будет достаточно, чтобы написать собственную таблицу стилей?
Вот пример для 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;
}
Рассматривали ли вы вместо этого использование setStyleSheet? Если вы действительно хотите нарисовать это сами, вы можете посмотреть, как это делается в исходном коде Qt: qt/src/gui/widgets/qslider.cpp