Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qtgradientwidget.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5#include <QtCore/QMap>
6#include <QtGui/QImage>
7#include <QtGui/QPainter>
8#include <QtWidgets/QScrollBar>
9#include <QtGui/QMouseEvent>
10#include <QtGui/QRegion>
11
12#ifndef _USE_MATH_DEFINES
13#define _USE_MATH_DEFINES
14#endif
15
16#include "qmath.h"
17
19
21{
22 QtGradientWidget *q_ptr;
23 Q_DECLARE_PUBLIC(QtGradientWidget)
24public:
26 QPointF toViewport(QPointF point) const;
27// void setupDrag(QtGradientStop *stop, int x);
28
29 QPointF checkRange(QPointF point) const;
30 QRectF pointRect(QPointF point, double size) const;
31
32 double correctAngle(double angle) const;
33 void setAngleConical(double angle);
34
35 void paintPoint(QPainter *painter, QPointF point, double size) const;
36
39
50
61
64 //double m_radiusOffset;
69};
70
71double QtGradientWidgetPrivate::correctAngle(double angle) const
72{
73 double a = angle;
74 while (a >= 360)
75 a -= 360;
76 while (a < 0)
77 a += 360;
78 return a;
79}
80
82{
83 double a = correctAngle(angle);
84 if (m_angleConical == a)
85 return;
86 m_angleConical = a;
87 emit q_ptr->angleConicalChanged(m_angleConical);
88}
89
90QRectF QtGradientWidgetPrivate::pointRect(QPointF point, double size) const
91{
92 return QRectF(point.x() - size / 2, point.y() - size / 2, size, size);
93}
94
96{
97 QPointF p = point;
98 if (p.x() > 1)
99 p.setX(1);
100 else if (p.x() < 0)
101 p.setX(0);
102 if (p.y() > 1)
103 p.setY(1);
104 else if (p.y() < 0)
105 p.setY(0);
106 return p;
107}
108
109QPointF QtGradientWidgetPrivate::fromViewport(QPointF point) const
110{
111 QSize size = q_ptr->size();
112 return QPointF(point.x() / size.width(), point.y() / size.height());
113}
114
116{
117 QSize size = q_ptr->size();
118 return QPointF(point.x() * size.width(), point.y() * size.height());
119}
120
121void QtGradientWidgetPrivate::paintPoint(QPainter *painter, QPointF point,
122 double size) const
123{
124 QPointF pf = toViewport(point);
125 QRectF rf = pointRect(pf, size);
126
127 QPen pen;
128 pen.setWidthF(1);
129 QColor alphaZero = Qt::white;
130 alphaZero.setAlpha(0);
131
132 painter->save();
133 painter->drawEllipse(rf);
134
135 /*
136 painter->save();
137
138 QLinearGradient lgV(0, rf.top(), 0, rf.bottom());
139 lgV.setColorAt(0, alphaZero);
140 lgV.setColorAt(0.25, Qt::white);
141 lgV.setColorAt(0.25, Qt::white);
142 lgV.setColorAt(1, alphaZero);
143 pen.setBrush(lgV);
144 painter->setPen(pen);
145
146 painter->drawLine(QPointF(pf.x(), rf.top()), QPointF(pf.x(), rf.bottom()));
147
148 QLinearGradient lgH(rf.left(), 0, rf.right(), 0);
149 lgH.setColorAt(0, alphaZero);
150 lgH.setColorAt(0.5, Qt::white);
151 lgH.setColorAt(1, alphaZero);
152 pen.setBrush(lgH);
153 painter->setPen(pen);
154
155 painter->drawLine(QPointF(rf.left(), pf.y()), QPointF(rf.right(), pf.y()));
156
157 painter->restore();
158 */
159
160 painter->restore();
161}
162
163/*
164void QtGradientWidgetPrivate::setupDrag(QtGradientStop *stop, int x)
165{
166 m_model->setCurrentStop(stop);
167
168 int viewportX = qRound(toViewport(stop->position()));
169 m_dragOffset = x - viewportX;
170
171 const auto stops = m_stops;
172 m_stops.clear();
173 for (QtGradientStop *s : stops) {
174 if (m_model->isSelected(s) || s == stop) {
175 m_dragStops[s] = s->position() - stop->position();
176 m_stops.append(s);
177 } else {
178 m_dragOriginal[s->position()] = s->color();
179 }
180 }
181 for (QtGradientStop *s : stops) {
182 if (!m_model->isSelected(s))
183 m_stops.append(s);
184 }
185 m_stops.removeAll(stop);
186 m_stops.prepend(stop);
187}
188*/
189////////////////////////////
190
191QtGradientWidget::QtGradientWidget(QWidget *parent)
192 : QWidget(parent), d_ptr(new QtGradientWidgetPrivate)
193{
194 d_ptr->q_ptr = this;
195 d_ptr->m_backgroundCheckered = true;
196 d_ptr->m_handleSize = 20.0;
197 d_ptr->m_gradientType = QGradient::LinearGradient;
198 d_ptr->m_startLinear = QPointF(0, 0);
199 d_ptr->m_endLinear = QPointF(1, 1);
200 d_ptr->m_centralRadial = QPointF(0.5, 0.5);
201 d_ptr->m_focalRadial = QPointF(0.5, 0.5);
202 d_ptr->m_radiusRadial = 0.5;
203 d_ptr->m_centralConical = QPointF(0.5, 0.5);
204 d_ptr->m_angleConical = 0;
205 d_ptr->m_dragHandle = QtGradientWidgetPrivate::NoHandle;
206
207 setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred));
208}
209
210QtGradientWidget::~QtGradientWidget()
211{
212}
213
214QSize QtGradientWidget::sizeHint() const
215{
216 return QSize(176, 176);
217}
218
219QSize QtGradientWidget::minimumSizeHint() const
220{
221 return QSize(128, 128);
222}
223
224int QtGradientWidget::heightForWidth(int w) const
225{
226 return w;
227}
228
229void QtGradientWidget::setBackgroundCheckered(bool checkered)
230{
231 if (d_ptr->m_backgroundCheckered == checkered)
232 return;
233 d_ptr->m_backgroundCheckered = checkered;
234 update();
235}
236
237bool QtGradientWidget::isBackgroundCheckered() const
238{
239 return d_ptr->m_backgroundCheckered;
240}
241
242void QtGradientWidget::mousePressEvent(QMouseEvent *e)
243{
244 if (e->button() != Qt::LeftButton)
245 return;
246
247 QPoint p = e->pos();
248 if (d_ptr->m_gradientType == QGradient::LinearGradient) {
249 QPointF startPoint = d_ptr->toViewport(d_ptr->m_startLinear);
250 double x = p.x() - startPoint.x();
251 double y = p.y() - startPoint.y();
252
253 if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 4) > (x * x + y * y)) {
254 d_ptr->m_dragHandle = QtGradientWidgetPrivate::StartLinearHandle;
255 d_ptr->m_dragOffset = QPointF(x, y);
256 update();
257 return;
258 }
259
260 QPointF endPoint = d_ptr->toViewport(d_ptr->m_endLinear);
261 x = p.x() - endPoint.x();
262 y = p.y() - endPoint.y();
263
264 if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 4) > (x * x + y * y)) {
265 d_ptr->m_dragHandle = QtGradientWidgetPrivate::EndLinearHandle;
266 d_ptr->m_dragOffset = QPointF(x, y);
267 update();
268 return;
269 }
270 } else if (d_ptr->m_gradientType == QGradient::RadialGradient) {
271 QPointF focalPoint = d_ptr->toViewport(d_ptr->m_focalRadial);
272 double x = p.x() - focalPoint.x();
273 double y = p.y() - focalPoint.y();
274
275 if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 9) > (x * x + y * y)) {
276 d_ptr->m_dragHandle = QtGradientWidgetPrivate::FocalRadialHandle;
277 d_ptr->m_dragOffset = QPointF(x, y);
278 update();
279 return;
280 }
281
282 QPointF centralPoint = d_ptr->toViewport(d_ptr->m_centralRadial);
283 x = p.x() - centralPoint.x();
284 y = p.y() - centralPoint.y();
285
286 if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 4) > (x * x + y * y)) {
287 d_ptr->m_dragHandle = QtGradientWidgetPrivate::CentralRadialHandle;
288 d_ptr->m_dragOffset = QPointF(x, y);
289 update();
290 return;
291 }
292
293 QPointF central = d_ptr->toViewport(d_ptr->m_centralRadial);
294 QRectF r = d_ptr->pointRect(central, 2 * d_ptr->m_handleSize / 3);
295 QRectF r1(0, r.y(), size().width(), r.height());
296 QRectF r2(r.x(), 0, r.width(), r.y());
297 QRectF r3(r.x(), r.y() + r.height(), r.width(), size().height() - r.y() - r.height());
298 QPointF pF(p.x(), p.y());
299 if (r1.contains(pF) || r2.contains(pF) || r3.contains(pF)) {
300 x = pF.x() / size().width() - d_ptr->m_centralRadial.x();
301 y = pF.y() / size().height() - d_ptr->m_centralRadial.y();
302 const double clickRadius = hypot(x, y);
303 //d_ptr->m_radiusOffset = d_ptr->m_radiusRadial - clickRadius;
304 d_ptr->m_radiusFactor = d_ptr->m_radiusRadial / clickRadius;
305 if (d_ptr->m_radiusFactor == 0)
306 d_ptr->m_radiusFactor = 1;
307 d_ptr->m_dragRadius = d_ptr->m_radiusRadial;
308 d_ptr->m_dragHandle = QtGradientWidgetPrivate::RadiusRadialHandle;
309 mouseMoveEvent(e);
310 update();
311 return;
312 }
313 } else if (d_ptr->m_gradientType == QGradient::ConicalGradient) {
314 QPointF centralPoint = d_ptr->toViewport(d_ptr->m_centralConical);
315 double x = p.x() - centralPoint.x();
316 double y = p.y() - centralPoint.y();
317
318 if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 4) > (x * x + y * y)) {
319 d_ptr->m_dragHandle = QtGradientWidgetPrivate::CentralConicalHandle;
320 d_ptr->m_dragOffset = QPointF(x, y);
321 update();
322 return;
323 }
324 double radius = size().width();
325 if (size().height() < radius)
326 radius = size().height();
327 radius /= 2;
328 double corr = d_ptr->m_handleSize / 3;
329 radius -= corr;
330 QPointF vp = d_ptr->toViewport(d_ptr->m_centralConical);
331 x = p.x() - vp.x();
332 y = p.y() - vp.y();
333 if (((radius - corr) * (radius - corr) < (x * x + y * y)) &&
334 ((radius + corr) * (radius + corr) > (x * x + y * y))) {
335 QPointF central = d_ptr->toViewport(d_ptr->m_centralConical);
336 QPointF current(e->pos().x(), e->pos().y());
337 x = current.x() - central.x();
338 y = current.y() - central.y();
339 x /= size().width() / 2;
340 y /= size().height() / 2;
341 const double angle = qRadiansToDegrees(atan2(-y, x));
342
343 d_ptr->m_angleOffset = d_ptr->m_angleConical - angle;
344 d_ptr->m_dragAngle = d_ptr->m_angleConical;
345 d_ptr->m_dragHandle = QtGradientWidgetPrivate::AngleConicalHandle;
346 update();
347 return;
348 }
349 }
350}
351
352void QtGradientWidget::mouseReleaseEvent(QMouseEvent *e)
353{
354 Q_UNUSED(e);
355 d_ptr->m_dragHandle = QtGradientWidgetPrivate::NoHandle;
356 update();
357}
358
359void QtGradientWidget::mouseMoveEvent(QMouseEvent *e)
360{
361 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::NoHandle)
362 return;
363
364 const QPointF newPos = e->position() - d_ptr->m_dragOffset;
365 QPointF newPoint = d_ptr->fromViewport(newPos);
366 if (newPoint.x() < 0)
367 newPoint.setX(0);
368 else if (newPoint.x() > 1)
369 newPoint.setX(1);
370 if (newPoint.y() < 0)
371 newPoint.setY(0);
372 else if (newPoint.y() > 1)
373 newPoint.setY(1);
374
375 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::StartLinearHandle) {
376 d_ptr->m_startLinear = newPoint;
377 emit startLinearChanged(newPoint);
378 } else if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::EndLinearHandle) {
379 d_ptr->m_endLinear = newPoint;
380 emit endLinearChanged(newPoint);
381 } else if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::CentralRadialHandle) {
382 d_ptr->m_centralRadial = newPoint;
383 emit centralRadialChanged(newPoint);
384 } else if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::FocalRadialHandle) {
385 d_ptr->m_focalRadial = newPoint;
386 emit focalRadialChanged(newPoint);
387 } else if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::RadiusRadialHandle) {
388 QPointF centralPoint = d_ptr->toViewport(d_ptr->m_centralRadial);
389 QPointF pF(e->pos().x(), e->pos().y());
390 double x = pF.x() - centralPoint.x();
391 double y = pF.y() - centralPoint.y();
392
393 if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 4) > (x * x + y * y)) {
394 if (d_ptr->m_radiusRadial != d_ptr->m_dragRadius) {
395 d_ptr->m_radiusRadial = d_ptr->m_dragRadius;
396 emit radiusRadialChanged(d_ptr->m_radiusRadial);
397 }
398 } else {
399 x = pF.x() / size().width() - d_ptr->m_centralRadial.x();
400 y = pF.y() / size().height() - d_ptr->m_centralRadial.y();
401 const double moveRadius = hypot(x, y);
402 //double newRadius = moveRadius + d_ptr->m_radiusOffset;
403 double newRadius = moveRadius * d_ptr->m_radiusFactor;
404 if (newRadius > 2)
405 newRadius = 2;
406 d_ptr->m_radiusRadial = newRadius;
407 emit radiusRadialChanged(d_ptr->m_radiusRadial);
408 }
409 } else if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::CentralConicalHandle) {
410 d_ptr->m_centralConical = newPoint;
411 emit centralConicalChanged(newPoint);
412 } else if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::AngleConicalHandle) {
413 QPointF centralPoint = d_ptr->toViewport(d_ptr->m_centralConical);
414 QPointF pF(e->pos().x(), e->pos().y());
415 double x = pF.x() - centralPoint.x();
416 double y = pF.y() - centralPoint.y();
417
418 if ((d_ptr->m_handleSize * d_ptr->m_handleSize / 4) > (x * x + y * y)) {
419 if (d_ptr->m_angleConical != d_ptr->m_dragAngle) {
420 d_ptr->m_angleConical = d_ptr->m_dragAngle;
421 emit angleConicalChanged(d_ptr->m_angleConical);
422 }
423 } else {
424 QPointF central = d_ptr->toViewport(d_ptr->m_centralConical);
425 QPointF current = pF;
426 x = current.x() - central.x();
427 y = current.y() - central.y();
428 x /= size().width() / 2;
429 y /= size().height() / 2;
430
431 const double angle = qRadiansToDegrees(atan2(-y, x)) + d_ptr->m_angleOffset;
432 d_ptr->setAngleConical(angle);
433 }
434 }
435 update();
436}
437
438void QtGradientWidget::mouseDoubleClickEvent(QMouseEvent *e)
439{
440 mousePressEvent(e);
441}
442
443void QtGradientWidget::paintEvent(QPaintEvent *e)
444{
445 Q_UNUSED(e);
446
447 QPainter p(this);
448
449 if (d_ptr->m_backgroundCheckered) {
450 int pixSize = 40;
451 QPixmap pm(2 * pixSize, 2 * pixSize);
452
453 QPainter pmp(&pm);
454 pmp.fillRect(0, 0, pixSize, pixSize, Qt::white);
455 pmp.fillRect(pixSize, pixSize, pixSize, pixSize, Qt::white);
456 pmp.fillRect(0, pixSize, pixSize, pixSize, Qt::black);
457 pmp.fillRect(pixSize, 0, pixSize, pixSize, Qt::black);
458
459 p.setBrushOrigin((size().width() % pixSize + pixSize) / 2, (size().height() % pixSize + pixSize) / 2);
460 p.fillRect(rect(), pm);
461 p.setBrushOrigin(0, 0);
462 }
463
464 QGradient *gradient = nullptr;
465 switch (d_ptr->m_gradientType) {
466 case QGradient::LinearGradient:
467 gradient = new QLinearGradient(d_ptr->m_startLinear, d_ptr->m_endLinear);
468 break;
469 case QGradient::RadialGradient:
470 gradient = new QRadialGradient(d_ptr->m_centralRadial, d_ptr->m_radiusRadial, d_ptr->m_focalRadial);
471 break;
472 case QGradient::ConicalGradient:
473 gradient = new QConicalGradient(d_ptr->m_centralConical, d_ptr->m_angleConical);
474 break;
475 default:
476 break;
477 }
478 if (!gradient)
479 return;
480
481 gradient->setStops(d_ptr->m_gradientStops);
482 gradient->setSpread(d_ptr->m_gradientSpread);
483
484 p.save();
485 p.scale(size().width(), size().height());
486 p.fillRect(QRect(0, 0, 1, 1), *gradient);
487 p.restore();
488
489 p.setRenderHint(QPainter::Antialiasing);
490
491 QColor c = QColor::fromRgbF(0.5, 0.5, 0.5, 0.5);
492 QBrush br(c);
493 p.setBrush(br);
494 QPen pen(Qt::white);
495 pen.setWidthF(1);
496 p.setPen(pen);
497 QPen dragPen = pen;
498 dragPen.setWidthF(2);
499 if (d_ptr->m_gradientType == QGradient::LinearGradient) {
500 p.save();
501 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::StartLinearHandle)
502 p.setPen(dragPen);
503 d_ptr->paintPoint(&p, d_ptr->m_startLinear, d_ptr->m_handleSize);
504 p.restore();
505
506 p.save();
507 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::EndLinearHandle)
508 p.setPen(dragPen);
509 d_ptr->paintPoint(&p, d_ptr->m_endLinear, d_ptr->m_handleSize);
510 p.restore();
511 } else if (d_ptr->m_gradientType == QGradient::RadialGradient) {
512 QPointF central = d_ptr->toViewport(d_ptr->m_centralRadial);
513
514 p.save();
515 QRectF r = d_ptr->pointRect(central, 2 * d_ptr->m_handleSize / 3);
516 QRectF r1(0, r.y(), size().width(), r.height());
517 QRectF r2(r.x(), 0, r.width(), r.y());
518 QRectF r3(r.x(), r.y() + r.height(), r.width(), size().height() - r.y() - r.height());
519 p.fillRect(r1, c);
520 p.fillRect(r2, c);
521 p.fillRect(r3, c);
522 p.setBrush(Qt::NoBrush);
523 p.save();
524 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::CentralRadialHandle)
525 p.setPen(dragPen);
526 d_ptr->paintPoint(&p, d_ptr->m_centralRadial, d_ptr->m_handleSize);
527 p.restore();
528
529 const QRectF rect = QRectF(central.x() - d_ptr->m_radiusRadial * size().width(),
530 central.y() - d_ptr->m_radiusRadial * size().height(),
531 2 * d_ptr->m_radiusRadial * size().width(),
532 2 * d_ptr->m_radiusRadial * size().height());
533 QRegion region(r1.toRect());
534 region += r2.toRect();
535 region += r3.toRect();
536 p.setClipRegion(region);
537
538 p.drawEllipse(rect);
539 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::RadiusRadialHandle) {
540 p.save();
541 p.setPen(dragPen);
542 QRectF rect = QRectF(central.x() - d_ptr->m_radiusRadial / d_ptr->m_radiusFactor * size().width(),
543 central.y() - d_ptr->m_radiusRadial / d_ptr->m_radiusFactor * size().height(),
544 2 * d_ptr->m_radiusRadial / d_ptr->m_radiusFactor * size().width(),
545 2 * d_ptr->m_radiusRadial / d_ptr->m_radiusFactor * size().height());
546 p.drawEllipse(rect);
547
548 p.restore();
549 }
550 p.restore();
551
552 p.save();
553 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::FocalRadialHandle)
554 p.setPen(dragPen);
555 d_ptr->paintPoint(&p, d_ptr->m_focalRadial, 2 * d_ptr->m_handleSize / 3);
556 p.restore();
557 } else if (d_ptr->m_gradientType == QGradient::ConicalGradient) {
558 double radius = size().width();
559 if (size().height() < radius)
560 radius = size().height();
561 radius /= 2;
562 double corr = d_ptr->m_handleSize / 3;
563 radius -= corr;
564 QPointF central = d_ptr->toViewport(d_ptr->m_centralConical);
565
566 p.save();
567 p.setBrush(Qt::NoBrush);
568 QPen pen2(c);
569 pen2.setWidthF(2 * d_ptr->m_handleSize / 3);
570 p.setPen(pen2);
571 p.drawEllipse(d_ptr->pointRect(central, 2 * radius));
572 p.restore();
573
574 p.save();
575 p.setBrush(Qt::NoBrush);
576 int pointCount = 2;
577 for (int i = 0; i < pointCount; i++) {
578 const qreal angle = qDegreesToRadians(i * 180.0 / pointCount + d_ptr->m_angleConical);
579 const QPointF ray(qCos(angle) * size().width() / 2,
580 -qSin(angle) * size().height() / 2);
581 const double mod = hypot(ray.x(), ray.y());
582 p.drawLine(QPointF(central.x() + ray.x() * (radius - corr) / mod,
583 central.y() + ray.y() * (radius - corr) / mod),
584 QPointF(central.x() + ray.x() * (radius + corr) / mod,
585 central.y() + ray.y() * (radius + corr) / mod));
586 p.drawLine(QPointF(central.x() - ray.x() * (radius - corr) / mod,
587 central.y() - ray.y() * (radius - corr) / mod),
588 QPointF(central.x() - ray.x() * (radius + corr) / mod,
589 central.y() - ray.y() * (radius + corr) / mod));
590 }
591 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::AngleConicalHandle) {
592 p.save();
593 p.setPen(dragPen);
594 const qreal angle = qDegreesToRadians(d_ptr->m_angleConical - d_ptr->m_angleOffset);
595 const QPointF ray(qCos(angle) * size().width() / 2,
596 -qSin(angle) * size().height() / 2);
597 const double mod = hypot(ray.x(), ray.y());
598 p.drawLine(QPointF(central.x() + ray.x() * (radius - corr) / mod,
599 central.y() + ray.y() * (radius - corr) / mod),
600 QPointF(central.x() + ray.x() * (radius + corr) / mod,
601 central.y() + ray.y() * (radius + corr) / mod));
602 p.restore();
603 }
604
605 p.restore();
606
607 p.save();
608 if (d_ptr->m_dragHandle == QtGradientWidgetPrivate::CentralConicalHandle)
609 p.setPen(dragPen);
610 d_ptr->paintPoint(&p, d_ptr->m_centralConical, d_ptr->m_handleSize);
611 p.restore();
612
613 }
614
615 delete gradient;
616}
617
618void QtGradientWidget::setGradientStops(const QGradientStops &stops)
619{
620 d_ptr->m_gradientStops = stops;
621 update();
622}
623
624QGradientStops QtGradientWidget::gradientStops() const
625{
626 return d_ptr->m_gradientStops;
627}
628
629void QtGradientWidget::setGradientType(QGradient::Type type)
630{
631 if (type == QGradient::NoGradient)
632 return;
633 if (d_ptr->m_gradientType == type)
634 return;
635
636 d_ptr->m_gradientType = type;
637 update();
638}
639
640QGradient::Type QtGradientWidget::gradientType() const
641{
642 return d_ptr->m_gradientType;
643}
644
645void QtGradientWidget::setGradientSpread(QGradient::Spread spread)
646{
647 if (d_ptr->m_gradientSpread == spread)
648 return;
649
650 d_ptr->m_gradientSpread = spread;
651 update();
652}
653
654QGradient::Spread QtGradientWidget::gradientSpread() const
655{
656 return d_ptr->m_gradientSpread;
657}
658
659void QtGradientWidget::setStartLinear(QPointF point)
660{
661 if (d_ptr->m_startLinear == point)
662 return;
663
664 d_ptr->m_startLinear = d_ptr->checkRange(point);
665 update();
666}
667
668QPointF QtGradientWidget::startLinear() const
669{
670 return d_ptr->m_startLinear;
671}
672
673void QtGradientWidget::setEndLinear(QPointF point)
674{
675 if (d_ptr->m_endLinear == point)
676 return;
677
678 d_ptr->m_endLinear = d_ptr->checkRange(point);
679 update();
680}
681
682QPointF QtGradientWidget::endLinear() const
683{
684 return d_ptr->m_endLinear;
685}
686
687void QtGradientWidget::setCentralRadial(QPointF point)
688{
689 if (d_ptr->m_centralRadial == point)
690 return;
691
692 d_ptr->m_centralRadial = point;
693 update();
694}
695
696QPointF QtGradientWidget::centralRadial() const
697{
698 return d_ptr->m_centralRadial;
699}
700
701void QtGradientWidget::setFocalRadial(QPointF point)
702{
703 if (d_ptr->m_focalRadial == point)
704 return;
705
706 d_ptr->m_focalRadial = point;
707 update();
708}
709
710QPointF QtGradientWidget::focalRadial() const
711{
712 return d_ptr->m_focalRadial;
713}
714
715void QtGradientWidget::setRadiusRadial(qreal radius)
716{
717 if (d_ptr->m_radiusRadial == radius)
718 return;
719
720 d_ptr->m_radiusRadial = radius;
721 update();
722}
723
724qreal QtGradientWidget::radiusRadial() const
725{
726 return d_ptr->m_radiusRadial;
727}
728
729void QtGradientWidget::setCentralConical(QPointF point)
730{
731 if (d_ptr->m_centralConical == point)
732 return;
733
734 d_ptr->m_centralConical = point;
735 update();
736}
737
738QPointF QtGradientWidget::centralConical() const
739{
740 return d_ptr->m_centralConical;
741}
742
743void QtGradientWidget::setAngleConical(qreal angle)
744{
745 if (d_ptr->m_angleConical == angle)
746 return;
747
748 d_ptr->m_angleConical = angle;
749 update();
750}
751
752qreal QtGradientWidget::angleConical() const
753{
754 return d_ptr->m_angleConical;
755}
756
757QT_END_NAMESPACE
QPointF checkRange(QPointF point) const
QPointF toViewport(QPointF point) const
QGradient::Spread m_gradientSpread
void paintPoint(QPainter *painter, QPointF point, double size) const
void setAngleConical(double angle)
QRectF pointRect(QPointF point, double size) const
double correctAngle(double angle) const
Combined button and popup list for selecting options.
constexpr double qRadiansToDegrees(double radians)
Definition qmath.h:286