#include #include #include #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(); }