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 + -
显示快捷键?