qtgradientwidget.cpp

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

CPP
783
字号
        emit centralRadialChanged(newPoint);    } else if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::FocalRadialHandle) {        d_ptr->m_focalRadial = newPoint;        emit focalRadialChanged(newPoint);    } else if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::RadiusRadialHandle) {        QPointF centralPoint = d_ptr->toViewport(d_ptr->m_centralRadial);        QPointF pF(e->pos().x(), e->pos().y());        double x = pF.x() - centralPoint.x();        double y = pF.y() - centralPoint.y();        if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 4) > (x * x + y * y)) {            if (d_ptr->m_radiusRadial != d_ptr->m_dragRadius) {                d_ptr->m_radiusRadial = d_ptr->m_dragRadius;                emit radiusRadialChanged(d_ptr->m_radiusRadial);            }        } else {            x = pF.x() / size().width() - d_ptr->m_centralRadial.x();            y = pF.y() / size().height() - d_ptr->m_centralRadial.y();            double moveRadius = sqrt(x * x + y * y);            //double newRadius = moveRadius + d_ptr->m_radiusOffset;            double newRadius = moveRadius * d_ptr->m_radiusFactor;            if (newRadius > 2)                newRadius = 2;            d_ptr->m_radiusRadial = newRadius;            emit radiusRadialChanged(d_ptr->m_radiusRadial);        }    } else if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::CentralConicalHandle) {        d_ptr->m_centralConical = newPoint;        emit centralConicalChanged(newPoint);    } else if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::AngleConicalHandle) {        QPointF centralPoint = d_ptr->toViewport(d_ptr->m_centralConical);        QPointF pF(e->pos().x(), e->pos().y());        double x = pF.x() - centralPoint.x();        double y = pF.y() - centralPoint.y();        if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 4) > (x * x + y * y)) {            if (d_ptr->m_angleConical != d_ptr->m_dragAngle) {                d_ptr->m_angleConical = d_ptr->m_dragAngle;                emit angleConicalChanged(d_ptr->m_angleConical);            }        } else {            QPointF central = d_ptr->toViewport(d_ptr->m_centralConical);            QPointF current = pF;            x = current.x() - central.x();            y = current.y() - central.y();            x /= size().width() / 2;            y /= size().height() / 2;            double r = sqrt(x * x + y * y);            double arcSin = asin(y / r);            double arcCos = acos(x / r);            double angle = arcCos * 180 / M_PI;            if (arcSin > 0) {                angle = -angle;            }            angle += d_ptr->m_angleOffset;            d_ptr->setAngleConical(angle);        }    }    update();}void QtGradientWidget::mouseDoubleClickEvent(QMouseEvent *e){    mousePressEvent(e);}void QtGradientWidget::paintEvent(QPaintEvent *e){    Q_UNUSED(e)    QPainter p(this);    if (!d_ptr->m_backgroundTransparent) {        int pixSize = 40;        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);        p.setBrushOrigin((size().width() % pixSize + pixSize) / 2, (size().height() % pixSize + pixSize) / 2);        p.fillRect(rect(), pm);        p.setBrushOrigin(0, 0);    }    QGradient *gradient = 0;    switch (d_ptr->m_gradientType) {        case QGradient::LinearGradient:            gradient = new QLinearGradient(d_ptr->m_startLinear, d_ptr->m_endLinear);            break;        case QGradient::RadialGradient:            gradient = new QRadialGradient(d_ptr->m_centralRadial, d_ptr->m_radiusRadial, d_ptr->m_focalRadial);            break;        case QGradient::ConicalGradient:            gradient = new QConicalGradient(d_ptr->m_centralConical, d_ptr->m_angleConical);            break;        default:            break;    }    if (!gradient)        return;    gradient->setStops(d_ptr->m_gradientStops);    gradient->setSpread(d_ptr->m_gradientSpread);    p.save();    p.scale(size().width(), size().height());    p.fillRect(QRect(0, 0, 1, 1), *gradient);    p.restore();    p.setRenderHint(QPainter::Antialiasing);    QColor c = QColor::fromRgbF(0.5, 0.5, 0.5, 0.5);    QBrush br(c);    p.setBrush(br);    QPen pen(Qt::white);    pen.setWidthF(1);    p.setPen(pen);    QPen dragPen = pen;    dragPen.setWidthF(2);    if (d_ptr->m_gradientType == QGradient::LinearGradient) {        p.save();        if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::StartLinearHandle)            p.setPen(dragPen);        p.drawEllipse(d_ptr->pointRect(d_ptr->toViewport(d_ptr->m_startLinear), d_ptr->m_handleSize));        p.restore();        p.save();        if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::EndLinearHandle)            p.setPen(dragPen);        p.drawEllipse(d_ptr->pointRect(d_ptr->toViewport(d_ptr->m_endLinear), d_ptr->m_handleSize));        p.restore();    } else if (d_ptr->m_gradientType == QGradient::RadialGradient) {        QPointF central = d_ptr->toViewport(d_ptr->m_centralRadial);        p.save();        QRectF r = d_ptr->pointRect(central, 2 * d_ptr->m_handleSize / 3);        QRectF r1(0, r.y(), size().width(), r.height());        QRectF r2(r.x(), 0, r.width(), r.y());        QRectF r3(r.x(), r.y() + r.height(), r.width(), size().height() - r.y() - r.height());        p.fillRect(r1, c);        p.fillRect(r2, c);        p.fillRect(r3, c);        p.setBrush(Qt::NoBrush);        p.save();        if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::CentralRadialHandle)            p.setPen(dragPen);        p.drawEllipse(d_ptr->pointRect(central, d_ptr->m_handleSize));        p.restore();        QRectF rect = QRectF(central.x() - d_ptr->m_radiusRadial * size().width(),                        central.y() - d_ptr->m_radiusRadial * size().height(),                        2 * d_ptr->m_radiusRadial * size().width(),                        2 * d_ptr->m_radiusRadial * size().height());        p.setClipRect(r1);        p.setClipRect(r2, Qt::UniteClip);        p.setClipRect(r3, Qt::UniteClip);        p.drawEllipse(rect);        if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::RadiusRadialHandle) {            p.save();            p.setPen(dragPen);            QRectF rect = QRectF(central.x() - d_ptr->m_radiusRadial / d_ptr->m_radiusFactor * size().width(),                    central.y() - d_ptr->m_radiusRadial / d_ptr->m_radiusFactor * size().height(),                    2 * d_ptr->m_radiusRadial / d_ptr->m_radiusFactor * size().width(),                    2 * d_ptr->m_radiusRadial / d_ptr->m_radiusFactor * size().height());            p.drawEllipse(rect);            p.restore();        }        /*        p.drawEllipse(d_ptr->pointRect(d_ptr->toViewport(d_ptr->m_centralRadial + QPointF(0, d_ptr->m_radiusRadial)),                        2 * d_ptr->m_handleSize / 3));        p.drawEllipse(d_ptr->pointRect(d_ptr->toViewport(d_ptr->m_centralRadial + QPointF(0, -d_ptr->m_radiusRadial)),                        2 * d_ptr->m_handleSize / 3));        p.drawEllipse(d_ptr->pointRect(d_ptr->toViewport(d_ptr->m_centralRadial + QPointF(d_ptr->m_radiusRadial, 0)),                        2 * d_ptr->m_handleSize / 3));        p.drawEllipse(d_ptr->pointRect(d_ptr->toViewport(d_ptr->m_centralRadial + QPointF(-d_ptr->m_radiusRadial, 0)),                        2 * d_ptr->m_handleSize / 3));        */        p.restore();        p.save();        if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::FocalRadialHandle)            p.setPen(dragPen);        p.drawEllipse(d_ptr->pointRect(d_ptr->toViewport(d_ptr->m_focalRadial), 2 * d_ptr->m_handleSize / 3));        p.restore();    } else if (d_ptr->m_gradientType == QGradient::ConicalGradient) {        double radius = size().width();        if (size().height() < radius)            radius = size().height();        radius /= 2;        double corr = d_ptr->m_handleSize / 3;        radius -= corr;        QPointF central = d_ptr->toViewport(d_ptr->m_centralConical);        p.save();        p.setBrush(Qt::NoBrush);        QPen pen2(c);        pen2.setWidthF(2 * d_ptr->m_handleSize / 3);        p.setPen(pen2);        p.drawEllipse(d_ptr->pointRect(central, 2 * radius));        p.restore();        p.save();        p.setBrush(Qt::NoBrush);        int pointCount = 2;        for (int i = 0; i < pointCount; i++) {            QPointF ang(cos(M_PI * (i * 180.0 / pointCount + d_ptr->m_angleConical) / 180) * size().width() / 2,                    -sin(M_PI * (i * 180.0 / pointCount + d_ptr->m_angleConical) / 180) * size().height() / 2);            double mod = sqrt(ang.x() * ang.x() + ang.y() * ang.y());            p.drawLine(QPointF(central.x() + ang.x() * (radius - corr) / mod,                        central.y() + ang.y() * (radius - corr) / mod),                    QPointF(central.x() + ang.x() * (radius + corr) / mod,                        central.y() + ang.y() * (radius + corr) / mod));            p.drawLine(QPointF(central.x() - ang.x() * (radius - corr) / mod,                        central.y() - ang.y() * (radius - corr) / mod),                    QPointF(central.x() - ang.x() * (radius + corr) / mod,                        central.y() - ang.y() * (radius + corr) / mod));        }        if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::AngleConicalHandle) {            p.save();            p.setPen(dragPen);            QPointF ang(cos(M_PI * (d_ptr->m_angleConical - d_ptr->m_angleOffset) / 180) * size().width() / 2,                    -sin(M_PI * (d_ptr->m_angleConical - d_ptr->m_angleOffset) / 180) * size().height() / 2);            double mod = sqrt(ang.x() * ang.x() + ang.y() * ang.y());            p.drawLine(QPointF(central.x() + ang.x() * (radius - corr) / mod,                        central.y() + ang.y() * (radius - corr) / mod),                    QPointF(central.x() + ang.x() * (radius + corr) / mod,                        central.y() + ang.y() * (radius + corr) / mod));            p.restore();        }        p.restore();        p.save();        if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::CentralConicalHandle)            p.setPen(dragPen);        p.drawEllipse(d_ptr->pointRect(central, d_ptr->m_handleSize));        p.restore();    }    delete gradient;}void QtGradientWidget::setGradientStops(const QGradientStops &stops){    d_ptr->m_gradientStops = stops;    update();}QGradientStops QtGradientWidget::gradientStops() const{    return d_ptr->m_gradientStops;}void QtGradientWidget::setGradientType(QGradient::Type type){    if (type == QGradient::NoGradient)        return;    if (d_ptr->m_gradientType == type)        return;    d_ptr->m_gradientType = type;    update();}QGradient::Type QtGradientWidget::gradientType() const{    return d_ptr->m_gradientType;}void QtGradientWidget::setGradientSpread(QGradient::Spread spread){    if (d_ptr->m_gradientSpread == spread)        return;    d_ptr->m_gradientSpread = spread;    update();}QGradient::Spread QtGradientWidget::gradientSpread() const{    return d_ptr->m_gradientSpread;}void QtGradientWidget::setStartLinear(const QPointF &point){    if (d_ptr->m_startLinear == point)        return;    d_ptr->m_startLinear = d_ptr->checkRange(point);    update();}QPointF QtGradientWidget::startLinear() const{    return d_ptr->m_startLinear;}void QtGradientWidget::setEndLinear(const QPointF &point){    if (d_ptr->m_endLinear == point)        return;    d_ptr->m_endLinear = d_ptr->checkRange(point);    update();}QPointF QtGradientWidget::endLinear() const{    return d_ptr->m_endLinear;}void QtGradientWidget::setCentralRadial(const QPointF &point){    if (d_ptr->m_centralRadial == point)        return;    d_ptr->m_centralRadial = point;    update();}QPointF QtGradientWidget::centralRadial() const{    return d_ptr->m_centralRadial;}void QtGradientWidget::setFocalRadial(const QPointF &point){    if (d_ptr->m_focalRadial == point)        return;    d_ptr->m_focalRadial = point;    update();}QPointF QtGradientWidget::focalRadial() const{    return d_ptr->m_focalRadial;}void QtGradientWidget::setRadiusRadial(qreal radius){    if (d_ptr->m_radiusRadial == radius)        return;    d_ptr->m_radiusRadial = radius;    update();}qreal QtGradientWidget::radiusRadial() const{    return d_ptr->m_radiusRadial;}void QtGradientWidget::setCentralConical(const QPointF &point){    if (d_ptr->m_centralConical == point)        return;    d_ptr->m_centralConical = point;    update();}QPointF QtGradientWidget::centralConical() const{    return d_ptr->m_centralConical;}void QtGradientWidget::setAngleConical(qreal angle){    if (d_ptr->m_angleConical == angle)        return;    d_ptr->m_angleConical = angle;    update();}qreal QtGradientWidget::angleConical() const{    return d_ptr->m_angleConical;}//#include "moc_qtgradientwidget.cpp"

⌨️ 快捷键说明

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