Я не верю, что вы можете сделать это, используя простую таблицу стилей. Но это легко сделать, специализируясь на классе QSlider
и применяя соответствующую таблицу стилей, когда пользователь перемещает курсор (т. Е. Когда вызывается valueChanged).
Вот класс, который я написал, который делает трюк. Он работает для горизонтального и вертикального курсора и может быть настроен для использования любого цвета. Он создает QImage от QLinearGradient, чтобы сохранить цветовую карту градиента, затем, когда изменяется значение ползунка, он извлекает соответствующий цвет из изображения на основе положения ползунка и применяет его через таблицу стилей.
Пробовал сделать класс универсальным для повторного использования, но его можно упростить, если вам не нужно настраивать цвета и использовать только горизонтальные слайдеры.
gradientslider.h:
#include <QSlider>
#include <QImage>
#include <QColor>
class GradientSlider : public QSlider
{
Q_OBJECT
public:
GradientSlider(QColor from, QColor to, Qt::Orientation orientation, QWidget* parent);
private slots:
void changeColor(int);
private:
QImage gradient;
};
gradientslider.cpp:
#include "gradientslider.h"
#include <QLinearGradient>
#include <QPainter>
GradientSlider::GradientSlider(QColor from, QColor to, Qt::Orientation orientation, QWidget* parent) :
QSlider(orientation, parent),
gradient(QSize(100,100), QImage::Format_RGB32)
{
// create linear gradient
QLinearGradient linearGrad(QPointF(0, 0), (orientation==Qt::Horizontal) ? QPointF(100, 0) : QPointF(0, 100));
linearGrad.setColorAt(0, from);
linearGrad.setColorAt(1, to);
// paint gradient in a QImage:
QPainter p(&gradient);
p.fillRect(gradient.rect(), linearGrad);
connect(this, SIGNAL(valueChanged(int)), this, SLOT(changeColor(int)));
// initialize
changeColor(value());
}
void GradientSlider::changeColor(int pos)
{
QColor color;
if (orientation() == Qt::Horizontal)
{
// retrieve color index based on cursor position
int posIndex = gradient.size().width() * (pos - minimum())/(maximum() - minimum());
posIndex = std::min(posIndex, gradient.width() - 1);
// pickup appropriate color
color = gradient.pixel(posIndex, gradient.size().height()/2);
}
else
{
// retrieve color index based on cursor position
int posIndex = gradient.size().height() * (pos - minimum())/(maximum() - minimum());
posIndex = std::min(posIndex, gradient.height() - 1);
// pickup appropriate color
color = gradient.pixel(gradient.size().width()/2, posIndex);
}
// create and apply stylesheet!
// can be customized to change background and handle border!
setStyleSheet("QSlider::handle:" + ((orientation() == Qt::Horizontal) ? QString("horizontal"):QString("vertical")) + "{ \
border-radius: 5px; \
border: 2px solid #FFFFFF; \
width: 20px; \
margin: -5px 0; \
background: " + color.name() + "}");
}
Теперь просто сделать:
QHBoxLayout* layout = new QHBoxLayout(this);
// horizontal slider:
layout->addWidget(new GradientSlider(QColor(79,174,231), QColor(251,192,22), Qt::Horizontal, this));
// or, vertical slider:
layout->addWidget(new GradientSlider(QColor(79,174,231), QColor(251,192,22), Qt::Vertical, this));
Цвета QColor(79,174,231)
(~ синий) и QColor(251,192,22)
(~ желтый) были взяты из изображения в исходном вопросительном столбце и могут быть заменены на Qt::blue
, Qt::yellow
(заканчивая слегка отличающейся окраской).
Это будет делать это:
Глядя на пример QSlider (http://doc.qt.io/qt-4.8/stylesheet-examples.html#customizing-qslider), похоже, что использование qlineargradient может помочь вам в том, что вам нужно. – Chris
@Chris 1. Пожалуйста, не указывайте ссылку на старую документацию. 2. Это даст градиент ** внутри ** рукоятки, а не градиент, следующий за движением. – IAmInPLS
Извините, что я использую Qt 4 на своей работе, так что это документация, к которой я привык смотреть. Если это не сработает, в событии рисования найдите значение ползунка и используйте его для вычисления значения цвета rgb (линейное отношение от вашего начального к вашему концу может выглядеть нормально). Затем вы можете установить цвет в дескрипторе цвета с помощью таблицы стилей. Наконец вызовите обычное событие окраски QSlider. – Chris