qtcolorline.cpp

来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 911 行 · 第 1/2 页

CPP
911
字号
    bool flip = m_flipped;    QPixmap pix;    int r = m_color.red();    int g = m_color.green();    int b = m_color.blue();    int h = m_color.hue();    int s = m_color.saturation();    int v = m_color.value();    int a = m_color.alpha();    if (m_component == QtColorLine::Hue)        pix = hueGradientPixmap(orient, flip, s, v, a);    else if (m_component == QtColorLine::Saturation)        pix = gradientPixmap(orient, QColor::fromHsv(h, 0, v, a), QColor::fromHsv(h, 0xFF, v, a), flip);    else if (m_component == QtColorLine::Value)        pix = gradientPixmap(orient, QColor::fromRgb(0, 0, 0, a), QColor::fromHsv(h, s, 0xFF, a), flip);    else if (m_component == QtColorLine::Red)        pix = gradientPixmap(orient, QColor::fromRgb(0, g, b, a), QColor::fromRgb(0xFF, g, b, a), flip);    else if (m_component == QtColorLine::Green)        pix = gradientPixmap(orient, QColor::fromRgb(r, 0, b, a), QColor::fromRgb(r, 0xFF, b, a), flip);    else if (m_component == QtColorLine::Blue)        pix = gradientPixmap(orient, QColor::fromRgb(r, g, 0, a), QColor::fromRgb(r, g, 0xFF, a), flip);    else if (m_component == QtColorLine::Alpha)        pix = gradientPixmap(orient, QColor::fromRgb(r, g, b, 0), QColor::fromRgb(r, g, b, 0xFF), flip);    m_mainPixmap = pix;    return;/*    QPixmap pm(20, 20);    QPainter pmp(&pm);    pmp.fillRect(0, 0, 10, 10, Qt::lightGray);    pmp.fillRect(10, 10, 10, 10, Qt::lightGray);    pmp.fillRect(0, 10, 10, 10, Qt::darkGray);    pmp.fillRect(10, 0, 10, 10, Qt::darkGray);    pmp.end();    QPainter p(&m_mainPixmap);    p.fillRect(QRect(QPoint(0, 0), m_pixmapSize), pm);    p.fillRect(QRect(QPoint(0, 0), m_pixmapSize), pix);*/    QImage img(m_pixmapSize, QImage::Format_ARGB32_Premultiplied);    QPainter p(&img);    p.setCompositionMode(QPainter::CompositionMode_Source);    p.fillRect(QRect(QPoint(0, 0), m_pixmapSize), pix);    m_mainPixmap = QPixmap::fromImage(img);//    QPainter p(&m_mainPixmap);//    p.fillRect(QRect(QPoint(0, 0), m_pixmapSize), pix);}QSize QtColorLinePrivate::pixmapSizeFromGeometrySize(        const QSize &geometrySize) const{    QSize size(m_indicatorSize + 2 * m_indicatorSpace - 1,                m_indicatorSize + 2 * m_indicatorSpace - 1);    if (m_orientation == Qt::Horizontal)        size.setHeight(0);    else        size.setWidth(0);    return geometrySize - size;}QColor QtColorLinePrivate::colorFromPoint(const QPointF &point) const{    QPointF p = point;    if (p.x() < 0)        p.setX(0.0);    else if (p.x() > 1)        p.setX(1.0);    if (p.y() < 0)        p.setY(0.0);    else if (p.y() > 1)        p.setY(1.0);    double pos = p.x();    if (m_orientation == Qt::Vertical)        pos = p.y();    if (m_flipped)        pos = 1.0 - pos;    QColor c;    qreal hue;    switch (m_component) {        case QtColorLine::Red:            c.setRgbF(pos, m_color.greenF(), m_color.blueF(), m_color.alphaF());            break;        case QtColorLine::Green:            c.setRgbF(m_color.redF(), pos, m_color.blueF(), m_color.alphaF());            break;        case QtColorLine::Blue:            c.setRgbF(m_color.redF(), m_color.greenF(), pos, m_color.alphaF());            break;        case QtColorLine::Hue:            hue = pos;            hue *= 35999.0 / 36000.0;            c.setHsvF(hue, m_color.saturationF(), m_color.valueF(), m_color.alphaF());            break;        case QtColorLine::Saturation:            c.setHsvF(m_color.hueF(), pos, m_color.valueF(), m_color.alphaF());            break;        case QtColorLine::Value:            c.setHsvF(m_color.hueF(), m_color.saturationF(), pos, m_color.alphaF());            break;        case QtColorLine::Alpha:            c.setHsvF(m_color.hueF(), m_color.saturationF(), m_color.valueF(), pos);            break;    }    return c;}QPointF QtColorLinePrivate::pointFromColor(const QColor &color) const{    qreal hue = color.hueF();    if (color.hue() == 360)        hue = 0.0;    else        hue *= 36000.0 / 35999.0;    double pos = 0.0;    switch (m_component) {        case QtColorLine::Red:            pos = color.redF();            break;        case QtColorLine::Green:            pos = color.greenF();            break;        case QtColorLine::Blue:            pos = color.blueF();            break;        case QtColorLine::Hue:            pos = hue;            break;        case QtColorLine::Saturation:            pos = color.saturationF();            break;        case QtColorLine::Value:            pos = color.valueF();            break;        case QtColorLine::Alpha:            pos = color.alphaF();            break;    }    if (m_flipped)        pos = 1.0 - pos;    QPointF p(pos, pos);    if (m_orientation == Qt::Horizontal)        p.setY(0);    else        p.setX(0);    return p;}QVector<QRect> QtColorLinePrivate::rects(const QPointF &point) const{    QRect r = q_ptr->geometry();    r.moveTo(0, 0);    int x1 = (int)((r.width() - m_indicatorSize - 2 * m_indicatorSpace) * point.x() + 0.5);    int x2 = x1 + m_indicatorSize + 2 * m_indicatorSpace;    int y1 = (int)((r.height() - m_indicatorSize - 2 * m_indicatorSpace) * point.y() + 0.5);    int y2 = y1 + m_indicatorSize + 2 * m_indicatorSpace;    QVector<QRect> rects;    if (m_orientation == Qt::Horizontal) {        // r0 r1 r2        QRect r0(0, 0, x1, r.height());        QRect r1(x1 + m_indicatorSpace, 0, m_indicatorSize, r.height());        QRect r2(x2, 0, r.width() - x2, r.height());        rects << r0 << r1 << r2;    } else {        // r0        // r1        // r2        QRect r0(0, 0, r.width(), y1);        QRect r1(0, y2, r.width(), r.height() - y2);        QRect r2(0, y1 + m_indicatorSpace, r.width(), m_indicatorSize);        rects << r0 << r1 << r2;    }    return rects;}void QtColorLinePrivate::resizeEvent(QResizeEvent *event){    m_pixmapSize = pixmapSizeFromGeometrySize(event->size());}void QtColorLinePrivate::paintEvent(QPaintEvent *){    QRect rect = q_ptr->rect();    QVector<QRect> r = rects(m_point);    QColor cBack = q_ptr->palette().color(QPalette::Active, QPalette::Window);    QColor c = colorFromPoint(m_point);    QPixmap pix(rect.size());    QPainter p(q_ptr);    if (!m_backgroundTransparent) {        int pixSize = 20;        QPixmap pm(2 * pixSize, 2 * pixSize);        QPainter pmp(&pm);        pmp.fillRect(0, 0, pixSize, pixSize, Qt::lightGray);        pmp.fillRect(pixSize, pixSize, pixSize, pixSize, Qt::lightGray);        pmp.fillRect(0, pixSize, pixSize, pixSize, Qt::darkGray);        pmp.fillRect(pixSize, 0, pixSize, pixSize, Qt::darkGray);        pmp.end();        p.end();        p.begin(&pix);        p.setBrushOrigin((rect.width() % pixSize + pixSize) / 2, (rect.height() % pixSize + pixSize) / 2);        p.fillRect(rect, pm);        p.setBrushOrigin(0, 0);    }    if (q_ptr->isEnabled()) {        validate();        QSize fieldSize = pixmapSizeFromGeometrySize(q_ptr->geometry().size());        QPoint posOnField = r[1].topLeft() - QPoint(m_indicatorSpace, m_indicatorSpace);        int x = posOnField.x();        int y = posOnField.y();        int w = fieldSize.width();        int h = fieldSize.height();        QRect r0, r2;        if (m_orientation == Qt::Horizontal) {            r0 = QRect(0, 0, x, m_pixmapSize.height());            r2 = QRect(x + 1, 0, w - x - 1, m_pixmapSize.height());        } else {            r0 = QRect(0, 0, m_pixmapSize.width(), y);            r2 = QRect(0, y + 1, m_pixmapSize.width(), h - y - 1);        }        p.setBrush(m_mainPixmap);        p.setPen(Qt::NoPen);        if (r[0].isValid()) {            p.drawRect(r[0]);        }        if (r[2].isValid()) {            p.setBrushOrigin(r[2].topLeft() - r2.topLeft());            p.drawRect(r[2]);        }        QPen pen(c);        p.setPen(pen);        p.setBrush(Qt::NoBrush);        if (r[1].isValid()) {            p.drawRect(r[1].adjusted(0, 0, -1, -1));            p.drawRect(r[1].adjusted(1, 1, -2, -2));        }        p.setPen(Qt::NoPen);        if (!m_backgroundTransparent)            p.fillRect(rect, pix);    }    p.setBrush(Qt::NoBrush);    int lw = 2;    int br = 1;    r[1].adjust(br, br, -br, -br);    if (r[1].adjusted(lw, lw, -lw, -lw).isValid()) {        QStyleOptionFrame opt;        opt.init(q_ptr);        opt.rect = r[1];        opt.lineWidth = 2;        opt.midLineWidth = 1;        if (m_dragging)            opt.state |= QStyle::State_Sunken;        else            opt.state |= QStyle::State_Raised;        q_ptr->style()->drawPrimitive(QStyle::PE_Frame, &opt, &p, q_ptr);        if (q_ptr->isEnabled())            p.fillRect(r[1].adjusted(lw, lw, -lw, -lw), c);    }}void QtColorLinePrivate::mousePressEvent(QMouseEvent *event){    if (event->button() != Qt::LeftButton)        return;    QVector<QRect> r = rects(m_point);    QPoint clickPos = event->pos();    QSize fieldSize = q_ptr->geometry().size() -            QSize(m_indicatorSize + 2 * m_indicatorSpace - 1, m_indicatorSize + 2 * m_indicatorSpace - 1);    QPoint posOnField = r[1].topLeft() - QPoint(m_indicatorSpace, m_indicatorSpace);    m_clickOffset = posOnField - clickPos;    if (!r[1].contains(clickPos))        return;    m_dragging = true;    q_ptr->update();}void QtColorLinePrivate::mouseMoveEvent(QMouseEvent *event){    if (!m_dragging)        return;    QPoint newPos = event->pos();    QSize fieldSize = q_ptr->geometry().size() -            QSize(m_indicatorSize + 2 * m_indicatorSpace - 1, m_indicatorSize + 2 * m_indicatorSpace - 1);    QPoint newPosOnField = newPos + m_clickOffset;    if (newPosOnField.x() < 0)        newPosOnField.setX(0);    else if (newPosOnField.x() > fieldSize.width())        newPosOnField.setX(fieldSize.width());    if (newPosOnField.y() < 0)        newPosOnField.setY(0);    else if (newPosOnField.y() > fieldSize.height())        newPosOnField.setY(fieldSize.height());    double x = (double)newPosOnField.x() / fieldSize.width();    double y = (double)newPosOnField.y() / fieldSize.height();    m_point = QPointF(x, y);    QColor color = colorFromPoint(m_point);    if (m_color == color)        return;    m_color = color;    emit q_ptr->colorChanged(color); // maybe before internal set, 1 line above    q_ptr->update();}void QtColorLinePrivate::mouseReleaseEvent(QMouseEvent *event){    if (event->button() != Qt::LeftButton)        return;    m_dragging = false;    q_ptr->update();}////////////////////////////////////////////////////QtColorLine::QtColorLine(QWidget *parent)    : QWidget(parent){    d_ptr = new QtColorLinePrivate;    d_ptr->q_ptr = this;    setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));}QtColorLine::~QtColorLine(){    delete d_ptr;}QSize QtColorLine::minimumSizeHint() const{    return QSize(d_ptr->m_indicatorSize, d_ptr->m_indicatorSize);}QSize QtColorLine::sizeHint() const{    return QSize(d_ptr->m_indicatorSize, d_ptr->m_indicatorSize);}void QtColorLine::setColor(const QColor &color){    d_ptr->setColor(color);}QColor QtColorLine::color() const{    return d_ptr->color();}void QtColorLine::setColorComponent(QtColorLine::ColorComponent component){    d_ptr->setColorComponent(component);}QtColorLine::ColorComponent QtColorLine::colorComponent() const{    return d_ptr->colorComponent();}void QtColorLine::setIndicatorSize(int size){    d_ptr->setIndicatorSize(size);}int QtColorLine::indicatorSize() const{    return d_ptr->indicatorSize();}void QtColorLine::setIndicatorSpace(int space){    d_ptr->setIndicatorSpace(space);}int QtColorLine::indicatorSpace() const{    return d_ptr->indicatorSpace();}void QtColorLine::setFlip(bool flip){    d_ptr->setFlip(flip);}bool QtColorLine::flip() const{    return d_ptr->flip();}void QtColorLine::setBackgroundTransparent(bool transparent){    d_ptr->setBackgroundTransparent(transparent);}bool QtColorLine::backgroundTransparent() const{    return d_ptr->backgroundTransparent();}void QtColorLine::setOrientation(Qt::Orientation orientation){    d_ptr->setOrientation(orientation);}Qt::Orientation QtColorLine::orientation() const{    return d_ptr->orientation();}void QtColorLine::resizeEvent(QResizeEvent *event){    d_ptr->resizeEvent(event);}void QtColorLine::paintEvent(QPaintEvent *event){    d_ptr->paintEvent(event);}void QtColorLine::mousePressEvent(QMouseEvent *event){    d_ptr->mousePressEvent(event);}void QtColorLine::mouseMoveEvent(QMouseEvent *event){    d_ptr->mouseMoveEvent(event);}void QtColorLine::mouseReleaseEvent(QMouseEvent *event){    d_ptr->mouseReleaseEvent(event);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?