qt/LedOK/ColorDialog/HColorArea.cpp
2022-01-04 18:11:48 +08:00

78 lines
1.8 KiB
C++

#include <QPainter>
#include <QMouseEvent>
#include <QLinearGradient>
#include <QtMath>
#include <QDebug>
#include "HColorArea.h"
HColorArea::HColorArea(QWidget *parent)
: QWidget(parent)
, m_hue(0.0)
, m_iHue(0)
{
createHuePixmap();
}
HColorArea::~HColorArea()
{
}
void HColorArea::setHue(int h)
{
m_hue = (double)h / 360;
m_iHue = h;
update();
}
void HColorArea::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.drawPixmap(0, 0, m_huePixmap);
int iHeight = m_iColorHeight - m_hue * m_iColorHeight;
QPolygonF triangle;
triangle.append(QPointF(m_iColorWidth, iHeight + topMargin));
triangle.append(QPointF(width(), iHeight));
triangle.append(QPointF(width(), iHeight + 2 * topMargin - 1));
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::white);
painter.drawPolygon(triangle);
}
void HColorArea::mousePressEvent(QMouseEvent *ev)
{
double tempValue = 1 - (double)(ev->pos().y() - topMargin) / m_iColorHeight;
m_hue = qBound(0.0, tempValue, 1.0);
update();
m_iHue = m_hue * 360;
emit hueChangedSignal(m_iHue);
}
void HColorArea::mouseMoveEvent(QMouseEvent *ev)
{
double tempValue = 1 - (double)(ev->pos().y() - topMargin) / m_iColorHeight;
m_hue = qBound(0.0, tempValue, 1.0);
update();
m_iHue = m_hue * 360;
emit hueChangedSignal(m_iHue);
}
void HColorArea::createHuePixmap()
{
m_huePixmap = QPixmap(34, 270);
m_huePixmap.fill(Qt::transparent);
QPainter painter(&m_huePixmap);
painter.setRenderHint(QPainter::Antialiasing);
QLinearGradient hueGradient(0, m_iColorHeight, 0, 0);
for (double i = 0; i < 1.0; i += 1.0 / 16)
{
hueGradient.setColorAt(i, QColor::fromHsvF(i, 1, 1, 1));
}
hueGradient.setColorAt(1, QColor::fromHsvF(0, 1, 1, 1));
painter.setPen(Qt::NoPen);
painter.setBrush(QBrush(hueGradient));
painter.drawRect(0, topMargin, m_iColorWidth, m_iColorHeight);
}