Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: kuzulis от Ноябрь 04, 2016, 16:58



Название: Слайдер с двумя ползунками и стилями
Отправлено: kuzulis от Ноябрь 04, 2016, 16:58
Всем привет.

Нужен некий новый виджет - слайдер с двумя "ручками", с поддержкой стилей
(знаю, что есть что-то подобное в libqxt, называется SpanSlider, но суть не в этом).

Сам виджет наследую от QSlider, а ручки рисую так:

Код
C++ (Qt)
MySlider::MySlider(QWidget *parent)
   : QSlider(Qt::Horizontal, parent)
{
}
 
void MySlider::paintEvent(QPaintEvent *ev)
{
   Q_UNUSED(ev);
   QPainter p(this);
 
   QStyleOptionSlider opt;
   initStyleOption(&opt);
 
   // Рисуем левую ручку.
   opt.sliderPosition = 0;
   opt.subControls = QStyle::SC_SliderHandle;
   style()->drawComplexControl(QStyle::CC_Slider, &opt, &p, this);
   // Рисуем правую ручку.
   opt.sliderPosition = 50;
   opt.subControls = QStyle::SC_SliderHandle;
   style()->drawComplexControl(QStyle::CC_Slider, &opt, &p, this);
}
 

Вроде все отрисовывается как надо.. НО.. как только устанавливаю фон виджету из
стилей:

Код
C++ (Qt)
app.setStyleSheet("MySlider { background-color: yellow; }");
 

... то отрисовывается только последняя ручка... ччерт..  >:( как быть?

PS: См. картинки в аттаче.


Название: Re: Слайдер с двумя ползунками и стилями
Отправлено: kuzulis от Ноябрь 04, 2016, 17:39
Хм.. кажется так работает:

Код
C++ (Qt)
void MySlider::paintEvent(QPaintEvent *ev)
{
   Q_UNUSED(ev);
   QPainter p(this);
 
   QStyleOptionSlider opt;
 
   // Рисуем левую ручку.
   initStyleOption(&opt);
   opt.sliderPosition = 0;
   opt.subControls = QStyle::SC_SliderHandle;
   opt.rect = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this);
   style()->drawComplexControl(QStyle::CC_Slider, &opt, &p, this);
 
   // Рисуем правую ручку.
   initStyleOption(&opt);
   opt.sliderPosition = 50;
   opt.subControls = QStyle::SC_SliderHandle;
   opt.rect = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this);
   style()->drawComplexControl(QStyle::CC_Slider, &opt, &p, this);
}