133 lines
3.0 KiB
C++
133 lines
3.0 KiB
C++
![]() |
#include <QPainter>
|
|||
|
#include <QMouseEvent>
|
|||
|
#include <QtMath>
|
|||
|
#include "SVColorArea.h"
|
|||
|
|
|||
|
SVColorArea::SVColorArea(QWidget *parent)
|
|||
|
: QWidget(parent)
|
|||
|
, m_iHue(0)
|
|||
|
, m_iSaturation(0)
|
|||
|
, m_iBrightness(0)
|
|||
|
, m_iAreaWidth(256)
|
|||
|
{
|
|||
|
createSVPixmap();
|
|||
|
createVPixmap();
|
|||
|
updateSVPixmap();
|
|||
|
}
|
|||
|
|
|||
|
SVColorArea::~SVColorArea()
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
void SVColorArea::setHue(int h)
|
|||
|
{
|
|||
|
m_iHue = h;
|
|||
|
updateSVPixmap();
|
|||
|
update();
|
|||
|
}
|
|||
|
|
|||
|
void SVColorArea::setSaturation(int s)
|
|||
|
{
|
|||
|
m_iSaturation = s;
|
|||
|
update();
|
|||
|
}
|
|||
|
|
|||
|
void SVColorArea::setBrightness(int v)
|
|||
|
{
|
|||
|
m_iBrightness = v;
|
|||
|
update();
|
|||
|
}
|
|||
|
|
|||
|
void SVColorArea::setHsv(int h, int s, int v)
|
|||
|
{
|
|||
|
m_iHue = h;
|
|||
|
m_iSaturation = s;
|
|||
|
m_iBrightness = v;
|
|||
|
updateSVPixmap();
|
|||
|
update();
|
|||
|
}
|
|||
|
|
|||
|
void SVColorArea::setColor(const QColor &c)
|
|||
|
{
|
|||
|
m_iHue = c.hue();
|
|||
|
m_iSaturation = c.saturation();
|
|||
|
m_iBrightness = c.value();
|
|||
|
updateSVPixmap();
|
|||
|
emit svChangedSignal(m_iHue, m_iSaturation, m_iBrightness);
|
|||
|
update();
|
|||
|
}
|
|||
|
|
|||
|
void SVColorArea::paintEvent(QPaintEvent *)
|
|||
|
{
|
|||
|
//画正方形的颜色区域
|
|||
|
QPainter painter(this);
|
|||
|
painter.setRenderHint(QPainter::Antialiasing);
|
|||
|
painter.drawPixmap(0, 0, m_svPixmap);
|
|||
|
painter.drawPixmap(0, 0, m_vPixmap);
|
|||
|
|
|||
|
//画颜色选取点的圆圈(亮度>128为黑色;<128为白色)
|
|||
|
painter.setPen(QPen(m_iBrightness > 128 ? Qt::black : Qt::white, 2));
|
|||
|
QPointF selecPos = QPointF(m_iSaturation, 255 - m_iBrightness);
|
|||
|
painter.drawEllipse(selecPos, 6, 6);
|
|||
|
}
|
|||
|
|
|||
|
void SVColorArea::mousePressEvent(QMouseEvent *ev)
|
|||
|
{
|
|||
|
m_iSaturation = qBound(0, ev->x(), 255);
|
|||
|
m_iBrightness = qBound(0, 255 - ev->y(), 255);
|
|||
|
emit svChangedSignal(m_iHue, m_iSaturation, m_iBrightness);
|
|||
|
update();
|
|||
|
}
|
|||
|
|
|||
|
void SVColorArea::mouseMoveEvent(QMouseEvent *ev)
|
|||
|
{
|
|||
|
m_iSaturation = qBound(0, ev->x(), 255);
|
|||
|
m_iBrightness = qBound(0, 255 - ev->y(), 255);
|
|||
|
emit svChangedSignal(m_iHue, m_iSaturation, m_iBrightness);
|
|||
|
update();
|
|||
|
}
|
|||
|
|
|||
|
void SVColorArea::createVPixmap()
|
|||
|
{
|
|||
|
m_vPixmap = QPixmap(m_iAreaWidth, m_iAreaWidth);
|
|||
|
m_vPixmap.fill(Qt::transparent);
|
|||
|
QPainter painter(&m_vPixmap);
|
|||
|
painter.setRenderHint(QPainter::Antialiasing);
|
|||
|
painter.setCompositionMode(QPainter::CompositionMode_Source);
|
|||
|
QLinearGradient vGradient(0, 0, 0, m_iAreaWidth);
|
|||
|
vGradient.setColorAt(0, QColor(0, 0, 0, 0));
|
|||
|
vGradient.setColorAt(1, QColor(0, 0, 0, 255));
|
|||
|
painter.setPen(Qt::NoPen);
|
|||
|
painter.setBrush(QBrush(vGradient));
|
|||
|
painter.drawRect(0, 0, m_iAreaWidth, m_iAreaWidth);
|
|||
|
}
|
|||
|
|
|||
|
void SVColorArea::createSVPixmap()
|
|||
|
{
|
|||
|
m_svPixmap = QPixmap(m_iAreaWidth, m_iAreaWidth);
|
|||
|
m_svPixmap.fill(Qt::transparent);
|
|||
|
}
|
|||
|
|
|||
|
void SVColorArea::updateSVPixmap()
|
|||
|
{
|
|||
|
QColor newColor;
|
|||
|
newColor.setHsv(m_iHue, 255, 255);
|
|||
|
QPainter painter(&m_svPixmap);
|
|||
|
painter.setRenderHint(QPainter::Antialiasing);
|
|||
|
QLinearGradient svGradient(0, 0, m_iAreaWidth, 0);
|
|||
|
svGradient.setColorAt(1, newColor);
|
|||
|
svGradient.setColorAt(0, QColor("#ffffff"));
|
|||
|
painter.setPen(Qt::NoPen);
|
|||
|
painter.setBrush(QBrush(svGradient));
|
|||
|
painter.drawRect(0, 0, m_iAreaWidth, m_iAreaWidth);
|
|||
|
}
|
|||
|
|
|||
|
void SVColorArea::hueChangedSlot(int h)
|
|||
|
{
|
|||
|
m_iHue = h;
|
|||
|
updateSVPixmap();
|
|||
|
emit svChangedSignal(m_iHue, m_iSaturation, m_iBrightness);
|
|||
|
update();
|
|||
|
}
|