Как настроить фон QSlider и сделать полупрозрачную ручку? - PullRequest
0 голосов
/ 09 апреля 2019

enter image description here

Я хочу, чтобы горизонтальный слайдер имел только два значения и выглядел так же, как показано на рисунке. Зеленая кнопка должна быть полупрозрачной, то есть буквы будут оставаться на своих местах, и когда кнопка будет перемещаться в любом месте по горизонтали, тексты будут видны.

Однако пока мне это не удалось. Мой код выглядит следующим образом.

Заголовочный файл.

#ifndef CUSTOMSLIDER_H
#define CUSTOMSLIDER_H

#include <QSlider>


class CustomSlider : public QSlider
{
    Q_OBJECT
public:
    explicit CustomSlider(QWidget *parent = nullptr);

protected:
    void paintEvent(QPaintEvent* aEvent);
    QColor m_backgroundColor;
    QColor m_color;
    QColor m_textColor;
    QString m_leftText;
    QString m_rightText;
    int m_fontSize;
    int m_radius;
};

#endif // CUSTOMSLIDER_H

Cpp файл.

#include "CustomSlider.h"
#include <QStylePainter>
#include <QStyleOptionSlider>

CustomSlider::CustomSlider(QWidget *parent):
    QSlider(parent),
    m_backgroundColor(Qt::gray),
    m_color(Qt::green),
    m_textColor(Qt::black),
    m_leftText("left"),
    m_rightText("right"),
    m_fontSize(12),
    m_radius(10)
{
    setFixedSize(140, 40);
    setMaximum(1);
    setMinimum(0);
    setValue(0);

    setStyleSheet("QSlider::handle:horizontal  {"
                  "background: rgba(0, 255, 0, 50);"
                  "border: 0px;"
                  "width: 70px;"
                  "height: 40px;"
                  "border-radius: "+QString::number(m_radius)+"px;"
                  "}");
}

void CustomSlider::paintEvent(QPaintEvent *aEvent)
{
    QStylePainter painter(this);
    painter.setPen(Qt::NoPen);
    painter.setBrush(m_backgroundColor);
    QRect canvas(0, 0, width(), height());
    painter.drawRoundedRect(canvas, m_radius, m_radius);
    painter.setBrush(m_color);
    painter.setPen(QPen(m_textColor, 1));
    painter.drawText((canvas.width()/4) - (painter.fontMetrics().width(m_leftText)/2),
                     canvas.height()/2 + (painter.fontMetrics().height()/4),
                     m_leftText);
    painter.drawText(canvas.right() - (canvas.width()/4) - (painter.fontMetrics().width(m_rightText)/2),
                     canvas.height()/2 + (painter.fontMetrics().height()/4),
                     m_rightText);
    QStyleOptionSlider opt;
    initStyleOption(&opt);
    opt.subControls = QStyle::SC_SliderHandle;
    painter.drawComplexControl(QStyle::CC_Slider, opt);

}

По какой-то причине фон полностью исчезает, и только кнопка отображается полупрозрачным зеленым цветом, а также не в соответствии с высотой и шириной, заданными в таблице стилей в конструкторе CustomSlider.

Что я делаю не так?

...