シンプルなスタイルシートを使用してこれを行うことはできません。しかし、QSlider
クラスを特化し、ユーザーがカーソルを移動したときに(つまり、valueChangedがエミットされているときに)適切なスタイルシートを適用すると、簡単に実行できます。
ここではトリックを書いたクラスがあります。それは、水平および垂直カーソルのために動作し、任意の色を使用するようにカスタマイズすることができます。グラデーションカラーマップを格納するためにQLinearGradientからQImageを作成し、スライダの値が変化すると、スライダの位置に基づいて画像から適切な色を抽出し、スタイルシートに適用します。
再利用性のためにクラスを汎用化しようとしましたが、色をカスタマイズする必要がなく、水平スライダのみを使用する必要がない場合は、クラスを簡略化できます。
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
(わずかに異なる色で終わる)に置き換えることができます。
これはそれを行います。
![enter image description here](https://i.stack.imgur.com/xvZvr.png)
QSliderの例(http://doc.qt.io/qt-4.8/stylesheet-examples.html#customizing-qslider)を見ると、qlineargradientを使用すると必要なものが得られるようです。 – Chris
@Chris 1.古い文書へのリンクを張らないでください。 2.これは、ハンドルの内側にグラジエント**を与え、モーションに続くグラディエントではありません。 – IAmInPLS
私は自分の仕事でQt 4を使用していることを残念に思うので、それは私が見慣れたドキュメントです。それがうまくいかない場合は、ペイントイベントでスライダの値を調べ、その値を使ってrgbカラー値を計算します(最初のカラーから最初のカラーまでの直線関係は大丈夫です)。スタイルシートを使用して、ハンドルの色を色に設定できます。最後に、通常のQSliderペイントイベントを呼び出します。 – Chris