나는 간단한 스타일 시트를 사용하여이 작업을 수행 할 수 있다고 생각하지 않습니다. 그러나 이는 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)
(~ 파란색)과 012,359,(~ 노란색)은 원래 질문 게시판의 이미지에서 가져 왔으며 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