243void QtGradientWidget::mousePressEvent(QMouseEvent *e)
245 if (e->button() != Qt::LeftButton)
249 if (d_ptr->m_gradientType == QGradient::LinearGradient) {
250 QPointF startPoint = d_ptr->toViewport(d_ptr->m_startLinear);
251 double x = p.x() - startPoint.x();
252 double y = p.y() - startPoint.y();
254 if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 4) > (x * x + y * y)) {
255 d_ptr->m_dragHandle = QtGradientWidgetPrivate::StartLinearHandle;
256 d_ptr->m_dragOffset = QPointF(x, y);
261 QPointF endPoint = d_ptr->toViewport(d_ptr->m_endLinear);
262 x = p.x() - endPoint.x();
263 y = p.y() - endPoint.y();
265 if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 4) > (x * x + y * y)) {
266 d_ptr->m_dragHandle = QtGradientWidgetPrivate::EndLinearHandle;
267 d_ptr->m_dragOffset = QPointF(x, y);
271 }
else if (d_ptr->m_gradientType == QGradient::RadialGradient) {
272 QPointF focalPoint = d_ptr->toViewport(d_ptr->m_focalRadial);
273 double x = p.x() - focalPoint.x();
274 double y = p.y() - focalPoint.y();
276 if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 9) > (x * x + y * y)) {
277 d_ptr->m_dragHandle = QtGradientWidgetPrivate::FocalRadialHandle;
278 d_ptr->m_dragOffset = QPointF(x, y);
283 QPointF centralPoint = d_ptr->toViewport(d_ptr->m_centralRadial);
284 x = p.x() - centralPoint.x();
285 y = p.y() - centralPoint.y();
287 if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 4) > (x * x + y * y)) {
288 d_ptr->m_dragHandle = QtGradientWidgetPrivate::CentralRadialHandle;
289 d_ptr->m_dragOffset = QPointF(x, y);
294 QPointF central = d_ptr->toViewport(d_ptr->m_centralRadial);
295 QRectF r = d_ptr->pointRect(central, 2 * d_ptr->m_handleSize / 3);
296 QRectF r1(0, r.y(), size().width(), r.height());
297 QRectF r2(r.x(), 0, r.width(), r.y());
298 QRectF r3(r.x(), r.y() + r.height(), r.width(), size().height() - r.y() - r.height());
299 QPointF pF(p.x(), p.y());
300 if (r1.contains(pF) || r2.contains(pF) || r3.contains(pF)) {
301 x = pF.x() / size().width() - d_ptr->m_centralRadial.x();
302 y = pF.y() / size().height() - d_ptr->m_centralRadial.y();
303 const double clickRadius = hypot(x, y);
305 d_ptr->m_radiusFactor = d_ptr->m_radiusRadial / clickRadius;
306 if (d_ptr->m_radiusFactor == 0)
307 d_ptr->m_radiusFactor = 1;
308 d_ptr->m_dragRadius = d_ptr->m_radiusRadial;
309 d_ptr->m_dragHandle = QtGradientWidgetPrivate::RadiusRadialHandle;
314 }
else if (d_ptr->m_gradientType == QGradient::ConicalGradient) {
315 QPointF centralPoint = d_ptr->toViewport(d_ptr->m_centralConical);
316 double x = p.x() - centralPoint.x();
317 double y = p.y() - centralPoint.y();
319 if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 4) > (x * x + y * y)) {
320 d_ptr->m_dragHandle = QtGradientWidgetPrivate::CentralConicalHandle;
321 d_ptr->m_dragOffset = QPointF(x, y);
325 double radius = size().width();
326 if (size().height() < radius)
327 radius = size().height();
329 double corr = d_ptr->m_handleSize / 3;
331 QPointF vp = d_ptr->toViewport(d_ptr->m_centralConical);
334 if (((radius - corr) * (radius - corr) < (x * x + y * y)) &&
335 ((radius + corr) * (radius + corr) > (x * x + y * y))) {
336 QPointF central = d_ptr->toViewport(d_ptr->m_centralConical);
337 QPointF current(e->pos().x(), e->pos().y());
338 x = current.x() - central.x();
339 y = current.y() - central.y();
340 x /= size().width() / 2;
341 y /= size().height() / 2;
344 d_ptr->m_angleOffset = d_ptr->m_angleConical - angle;
345 d_ptr->m_dragAngle = d_ptr->m_angleConical;
346 d_ptr->m_dragHandle = QtGradientWidgetPrivate::AngleConicalHandle;
360void QtGradientWidget::mouseMoveEvent(QMouseEvent *e)
362 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::NoHandle)
365 const QPointF newPos = e->position() - d_ptr->m_dragOffset;
366 QPointF newPoint = d_ptr->fromViewport(newPos);
367 if (newPoint.x() < 0)
369 else if (newPoint.x() > 1)
371 if (newPoint.y() < 0)
373 else if (newPoint.y() > 1)
376 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::StartLinearHandle) {
377 d_ptr->m_startLinear = newPoint;
378 emit startLinearChanged(newPoint);
379 }
else if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::EndLinearHandle) {
380 d_ptr->m_endLinear = newPoint;
381 emit endLinearChanged(newPoint);
382 }
else if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::CentralRadialHandle) {
383 d_ptr->m_centralRadial = newPoint;
384 emit centralRadialChanged(newPoint);
385 }
else if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::FocalRadialHandle) {
386 d_ptr->m_focalRadial = newPoint;
387 emit focalRadialChanged(newPoint);
388 }
else if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::RadiusRadialHandle) {
389 QPointF centralPoint = d_ptr->toViewport(d_ptr->m_centralRadial);
390 QPointF pF(e->pos().x(), e->pos().y());
391 double x = pF.x() - centralPoint.x();
392 double y = pF.y() - centralPoint.y();
394 if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 4) > (x * x + y * y)) {
395 if (d_ptr->m_radiusRadial != d_ptr->m_dragRadius) {
396 d_ptr->m_radiusRadial = d_ptr->m_dragRadius;
397 emit radiusRadialChanged(d_ptr->m_radiusRadial);
400 x = pF.x() / size().width() - d_ptr->m_centralRadial.x();
401 y = pF.y() / size().height() - d_ptr->m_centralRadial.y();
402 const double moveRadius = hypot(x, y);
404 double newRadius = moveRadius * d_ptr->m_radiusFactor;
407 d_ptr->m_radiusRadial = newRadius;
408 emit radiusRadialChanged(d_ptr->m_radiusRadial);
410 }
else if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::CentralConicalHandle) {
411 d_ptr->m_centralConical = newPoint;
412 emit centralConicalChanged(newPoint);
413 }
else if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::AngleConicalHandle) {
414 QPointF centralPoint = d_ptr->toViewport(d_ptr->m_centralConical);
415 QPointF pF(e->pos().x(), e->pos().y());
416 double x = pF.x() - centralPoint.x();
417 double y = pF.y() - centralPoint.y();
419 if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 4) > (x * x + y * y)) {
420 if (d_ptr->m_angleConical != d_ptr->m_dragAngle) {
421 d_ptr->m_angleConical = d_ptr->m_dragAngle;
422 emit angleConicalChanged(d_ptr->m_angleConical);
425 QPointF central = d_ptr->toViewport(d_ptr->m_centralConical);
426 QPointF current = pF;
427 x = current.x() - central.x();
428 y = current.y() - central.y();
429 x /= size().width() / 2;
430 y /= size().height() / 2;
432 const double angle = qRadiansToDegrees(atan2(-y, x)) + d_ptr->m_angleOffset;
433 d_ptr->setAngleConical(angle);
444void QtGradientWidget::paintEvent(QPaintEvent *e)
450 if (d_ptr->m_backgroundCheckered) {
452 QPixmap pm(2 * pixSize, 2 * pixSize);
455 pmp.fillRect(0, 0, pixSize, pixSize, Qt::white);
456 pmp.fillRect(pixSize, pixSize, pixSize, pixSize, Qt::white);
457 pmp.fillRect(0, pixSize, pixSize, pixSize, Qt::black);
458 pmp.fillRect(pixSize, 0, pixSize, pixSize, Qt::black);
460 p.setBrushOrigin((size().width() % pixSize + pixSize) / 2, (size().height() % pixSize + pixSize) / 2);
461 p.fillRect(rect(), pm);
462 p.setBrushOrigin(0, 0);
465 QGradient *gradient =
nullptr;
466 switch (d_ptr->m_gradientType) {
467 case QGradient::LinearGradient:
468 gradient =
new QLinearGradient(d_ptr->m_startLinear, d_ptr->m_endLinear);
470 case QGradient::RadialGradient:
471 gradient =
new QRadialGradient(d_ptr->m_centralRadial, d_ptr->m_radiusRadial, d_ptr->m_focalRadial);
473 case QGradient::ConicalGradient:
474 gradient =
new QConicalGradient(d_ptr->m_centralConical, d_ptr->m_angleConical);
482 gradient->setStops(d_ptr->m_gradientStops);
483 gradient->setSpread(d_ptr->m_gradientSpread);
486 p.scale(size().width(), size().height());
487 p.fillRect(QRect(0, 0, 1, 1), *gradient);
490 p.setRenderHint(QPainter::Antialiasing);
492 QColor c = QColor::fromRgbF(0.5, 0.5, 0.5, 0.5);
499 dragPen.setWidthF(2);
500 if (d_ptr->m_gradientType == QGradient::LinearGradient) {
502 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::StartLinearHandle)
504 d_ptr->paintPoint(&p, d_ptr->m_startLinear, d_ptr->m_handleSize);
508 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::EndLinearHandle)
510 d_ptr->paintPoint(&p, d_ptr->m_endLinear, d_ptr->m_handleSize);
512 }
else if (d_ptr->m_gradientType == QGradient::RadialGradient) {
513 QPointF central = d_ptr->toViewport(d_ptr->m_centralRadial);
516 QRectF r = d_ptr->pointRect(central, 2 * d_ptr->m_handleSize / 3);
517 QRectF r1(0, r.y(), size().width(), r.height());
518 QRectF r2(r.x(), 0, r.width(), r.y());
519 QRectF r3(r.x(), r.y() + r.height(), r.width(), size().height() - r.y() - r.height());
523 p.setBrush(Qt::NoBrush);
525 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::CentralRadialHandle)
527 d_ptr->paintPoint(&p, d_ptr->m_centralRadial, d_ptr->m_handleSize);
530 const QRectF rect = QRectF(central.x() - d_ptr->m_radiusRadial * size().width(),
531 central.y() - d_ptr->m_radiusRadial * size().height(),
532 2 * d_ptr->m_radiusRadial * size().width(),
533 2 * d_ptr->m_radiusRadial * size().height());
534 QRegion region(r1.toRect());
535 region += r2.toRect();
536 region += r3.toRect();
537 p.setClipRegion(region);
540 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::RadiusRadialHandle) {
543 QRectF rect = QRectF(central.x() - d_ptr->m_radiusRadial / d_ptr->m_radiusFactor * size().width(),
544 central.y() - d_ptr->m_radiusRadial / d_ptr->m_radiusFactor * size().height(),
545 2 * d_ptr->m_radiusRadial / d_ptr->m_radiusFactor * size().width(),
546 2 * d_ptr->m_radiusRadial / d_ptr->m_radiusFactor * size().height());
554 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::FocalRadialHandle)
556 d_ptr->paintPoint(&p, d_ptr->m_focalRadial, 2 * d_ptr->m_handleSize / 3);
558 }
else if (d_ptr->m_gradientType == QGradient::ConicalGradient) {
559 double radius = size().width();
560 if (size().height() < radius)
561 radius = size().height();
563 double corr = d_ptr->m_handleSize / 3;
565 QPointF central = d_ptr->toViewport(d_ptr->m_centralConical);
568 p.setBrush(Qt::NoBrush);
570 pen2.setWidthF(2 * d_ptr->m_handleSize / 3);
572 p.drawEllipse(d_ptr->pointRect(central, 2 * radius));
576 p.setBrush(Qt::NoBrush);
578 for (
int i = 0; i < pointCount; i++) {
579 const qreal angle = qDegreesToRadians(i * 180.0 / pointCount + d_ptr->m_angleConical);
580 const QPointF ray(qCos(angle) * size().width() / 2,
581 -qSin(angle) * size().height() / 2);
582 const double mod = hypot(ray.x(), ray.y());
583 p.drawLine(QPointF(central.x() + ray.x() * (radius - corr) / mod,
584 central.y() + ray.y() * (radius - corr) / mod),
585 QPointF(central.x() + ray.x() * (radius + corr) / mod,
586 central.y() + ray.y() * (radius + corr) / mod));
587 p.drawLine(QPointF(central.x() - ray.x() * (radius - corr) / mod,
588 central.y() - ray.y() * (radius - corr) / mod),
589 QPointF(central.x() - ray.x() * (radius + corr) / mod,
590 central.y() - ray.y() * (radius + corr) / mod));
592 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::AngleConicalHandle) {
595 const qreal angle = qDegreesToRadians(d_ptr->m_angleConical - d_ptr->m_angleOffset);
596 const QPointF ray(qCos(angle) * size().width() / 2,
597 -qSin(angle) * size().height() / 2);
598 const double mod = hypot(ray.x(), ray.y());
599 p.drawLine(QPointF(central.x() + ray.x() * (radius - corr) / mod,
600 central.y() + ray.y() * (radius - corr) / mod),
601 QPointF(central.x() + ray.x() * (radius + corr) / mod,
602 central.y() + ray.y() * (radius + corr) / mod));
609 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::CentralConicalHandle)
611 d_ptr->paintPoint(&p, d_ptr->m_centralConical, d_ptr->m_handleSize);