галочки исчезают на стилизованном QSlider

Я использую Qt 5.3 и пытаюсь создать QSlider. Однако, когда я применяю свою таблицу стилей, галочки исчезают. Кто-нибудь знает, как сохранить стиль, не затрагивая галочки?

Вот таблица стилей:

QSlider::groove:horizontal
{
    border: 1px inset #B0B0B0;
    background-color: #EAEAEA;
    height: 2px;
}

QSlider::Handle
{   
    border: 1px solid black;
    background: #B0B0B0;                        
    background-image: url(:/metal_background_small);    
    width: 12px;
    margin: -8px 0;
}

QSlider::Handle:Hover
{   
    border: 1px solid black;
    background: #707070;                        
    background-image: url(:/metal_background_small);    
}

QSlider::sub-page
{
/*  margin: 7px 1px 7px 0px;*/
    height: 2px;
    background: #05bcfe;
}

person Nicolas Holthaus    schedule 17.12.2014    source источник
comment
Я заметил на нескольких виджетах, что если вы начинаете стилизовать что-то с помощью таблиц стилей, вы должны определить все, иначе это будет пропущено. Я не могу сказать, предназначено ли это, мне кажется, больше похоже на ошибку   -  person Bowdzone    schedule 18.12.2014


Ответы (1)


Таблицы стилей Qt и галочки НЕ сочетаются друг с другом. самое простое решение — создать подкласс QSlider и повторно реализовать paint_event.

virtual void paintEvent(QPaintEvent *ev)
{

    QStylePainter p(this);
    QStyleOptionSlider opt;
    initStyleOption(&opt);

    QRect handle = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this);

    // draw tick marks
    // do this manually because they are very badly behaved with style sheets
    int interval = tickInterval();
    if (interval == 0)
    {
        interval = pageStep();
    }

    if (tickPosition() != NoTicks)
    {
        for (int i = minimum(); i <= maximum(); i += interval)
        {
            int x = round((double)((double)((double)(i - this->minimum()) / (double)(this->maximum() - this->minimum())) * (double)(this->width() - handle.width()) + (double)(handle.width() / 2.0))) - 1;
            int h = 4;
            p.setPen(QColor("#a5a294"));
            if (tickPosition() == TicksBothSides || tickPosition() == TicksAbove)
            {
                int y = this->rect().top();
                p.drawLine(x, y, x, y + h);
            }
            if (tickPosition() == TicksBothSides || tickPosition() == TicksBelow)
            {
                int y = this->rect().bottom();
                p.drawLine(x, y, x, y - h);
            }

        }
    }

    // draw the slider (this is basically copy/pasted from QSlider::paintEvent)
    opt.subControls = QStyle::SC_SliderGroove;
    p.drawComplexControl(QStyle::CC_Slider, opt);

    // draw the slider handle
    opt.subControls = QStyle::SC_SliderHandle;
    p.drawComplexControl(QStyle::CC_Slider, opt);
}
person Nicolas Holthaus    schedule 17.12.2014
comment
Связанные отчеты об ошибках Qt: bugreports.qt.io/browse/QTBUG-3304, bugreports.qt.io/browse/QTBUG-3564 - person Damian Dixon; 21.07.2020