Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qquickdial.cpp
Go to the documentation of this file.
1// Copyright (C) 2017 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
4#include "qquickdial_p.h"
6
7#include <QtCore/qmath.h>
8#include <QtQuick/private/qquickflickable_p.h>
9#include <QtQuickTemplates2/private/qquickcontrol_p_p.h>
10
11#include <cmath>
12
14
19
74// The user angle is the clockwise angle between the position and the vertical
75// y-axis (12 o clock position).
76// Using radians for logic (atan2(...)) and degree for user interface
77constexpr qreal toUserAngleDeg(qreal logicAngleRad) {
78 // minus to turn clockwise, add 90 deg clockwise
79 return -logicAngleRad / M_PI * 180. + 90;
80}
81
82static const qreal defaultStartAngle = -140;
83static const qreal defaultEndAngle = 140;
84
86{
87 Q_DECLARE_PUBLIC(QQuickDial)
88
89public:
92 qreal positionAt(const QPointF &point) const;
93 qreal circularPositionAt(const QPointF &point) const;
94 qreal linearPositionAt(const QPointF &point) const;
96 void updatePosition();
97 bool isLargeChange(qreal proposedPosition) const;
98 bool isHorizontalOrVertical() const;
99
100 bool handlePress(const QPointF &point, ulong timestamp) override;
101 bool handleMove(const QPointF &point, ulong timestamp) override;
102 bool handleRelease(const QPointF &point, ulong timestamp) override;
103 void handleUngrab() override;
104
105 void cancelHandle();
106 void executeHandle(bool complete = false);
107
109
111
124 QQuickDeferredPointer<QQuickItem> handle;
125 bool wrap = false;
126 bool live = true;
127 bool pressed = false;
129};
130
132{
133 qreal value = from + (to - from) * position;
134
135 /* play nice with users expecting that integer from, to and stepSize leads to
136 integer values - given that we are using floating point internally (and in
137 the API of value), this does not hold, but it is easy enough to handle
138 */
140 value = qRound(value);
141
142 return value;
143}
144
146{
147 const qreal range = to - from;
148 if (qFuzzyIsNull(range))
149 return position;
150
151 const qreal effectiveStep = stepSize / range;
152 if (qFuzzyIsNull(effectiveStep))
153 return position;
154
155 return qRound(position / effectiveStep) * effectiveStep;
156}
157
162
164{
165 qreal yy = height / 2.0 - point.y();
166 qreal xx = point.x() - width / 2.0;
167 qreal alpha = (xx || yy) ? toUserAngleDeg(std::atan2(yy, xx)) : 0;
168
169 // Move around the circle to reach the interval.
170 if (alpha < startAngle && alpha + 360. < endAngle)
171 alpha += 360.;
172 else if (alpha >= endAngle && alpha - 360. >= startAngle)
173 alpha -= 360.;
174
175 // If wrap is on and we are out of the interval [startAngle, endAngle],
176 // we want to jump to the closest border to make it feel nice and responsive
177 if ((alpha < startAngle || alpha > endAngle) && wrap) {
178 if (abs(alpha - startAngle) > abs(endAngle - alpha - 360.))
179 alpha += 360.;
180 else if (abs(alpha - startAngle - 360.) < abs(endAngle - alpha))
181 alpha -= 360.;
182 }
183
184 // If wrap is off,
185 // we want to stay as close as possible to the current angle.
186 // This is important to allow easy setting of boundary values (0,1)
187 if (!wrap) {
188 if (abs(angle - alpha) > abs(angle - (alpha + 360.)))
189 alpha += 360.;
190 if (abs(angle - alpha) > abs(angle - (alpha - 360.)))
191 alpha -= 360.;
192 }
193
194 return (alpha - startAngle) / (endAngle - startAngle);
195}
196
198{
199 // This value determines the range (either horizontal or vertical)
200 // within which the dial can be dragged.
201 // The larger this value is, the further the drag distance
202 // must be to go from a position of e.g. 0.0 to 1.0.
203 qreal dragArea = 0;
204
205 // The linear input mode uses a "relative" input system,
206 // where the distance from the press point is used to calculate
207 // the change in position. Moving the mouse above the press
208 // point increases the position (when inputMode is Vertical),
209 // and vice versa. This prevents the dial from jumping when clicked.
210 qreal dragDistance = 0;
211
213 dragArea = width * 2;
214 dragDistance = pressPoint.x() - point.x();
215 } else {
216 dragArea = height * 2;
217 dragDistance = point.y() - pressPoint.y();
218 }
219 const qreal normalisedDifference = dragDistance / dragArea;
220 return qBound(qreal(0), positionBeforePress - normalisedDifference, qreal(1));
221}
222
224{
225 Q_Q(QQuickDial);
226 pos = qBound<qreal>(qreal(0), pos, qreal(1));
229 return;
230
231 angle = alpha;
232 position = pos;
233
234
235 emit q->positionChanged();
236 emit q->angleChanged();
237}
238
240{
241 qreal pos = 0;
242 if (!qFuzzyCompare(from, to))
243 pos = (value - from) / (to - from);
245}
246
247bool QQuickDialPrivate::isLargeChange(qreal proposedPosition) const
248{
249 if (endAngle - startAngle < 180.0)
250 return false;
251 return qAbs(proposedPosition - position) > qreal(0.5);
252}
253
258
259bool QQuickDialPrivate::handlePress(const QPointF &point, ulong timestamp)
260{
261 Q_Q(QQuickDial);
262 QQuickControlPrivate::handlePress(point, timestamp);
263 pressPoint = point;
265 q->setPressed(true);
266 return true;
267}
268
269bool QQuickDialPrivate::handleMove(const QPointF &point, ulong timestamp)
270{
271 Q_Q(QQuickDial);
272 QQuickControlPrivate::handleMove(point, timestamp);
273 const qreal oldPos = position;
274 qreal pos = qBound(0.0, positionAt(point), 1.0);
277
279
281 if (live)
282 q->setValue(valueAt(pos));
283 else
285 if (!qFuzzyCompare(pos, oldPos))
286 emit q->moved();
287 }
288 return true;
289}
290
291bool QQuickDialPrivate::handleRelease(const QPointF &point, ulong timestamp)
292{
293 Q_Q(QQuickDial);
294 QQuickControlPrivate::handleRelease(point, timestamp);
295 if (q->keepMouseGrab() || q->keepTouchGrab()) {
296 const qreal oldPos = position;
297 qreal pos = positionAt(point);
300
302
304 q->setValue(valueAt(pos));
305 if (!qFuzzyCompare(pos, oldPos))
306 emit q->moved();
307
308 q->setKeepMouseGrab(false);
309 q->setKeepTouchGrab(false);
310 }
311
312 q->setPressed(false);
315 return true;
316}
317
319{
320 Q_Q(QQuickDial);
324 q->setPressed(false);
325}
326
332
334{
335 Q_Q(QQuickDial);
336 if (handle.wasExecuted())
337 return;
338
339 if (!handle || complete)
341 if (complete)
343}
344
345template<typename ...Real>
346static bool areRepresentableAsInteger(Real... numbers) {
347 auto check = [](qreal number) -> bool { return std::nearbyint(number) == number; };
348 return (... && check(numbers));
349}
350
355
363
365 : QQuickControl(*(new QQuickDialPrivate), parent)
366{
369#if QT_CONFIG(quicktemplates2_multitouch)
371#endif
372#if QT_CONFIG(cursor)
374#endif
375 Q_D(QQuickDial);
377}
378
387{
388 Q_D(const QQuickDial);
389 return d->from;
390}
391
393{
394 Q_D(QQuickDial);
395 if (qFuzzyCompare(d->from, from))
396 return;
397
398 d->from = from;
400 d->updateAllValuesAreInteger();
401 if (isComponentComplete()) {
402 setValue(d->value);
403 d->updatePosition();
404 }
405}
406
416{
417 Q_D(const QQuickDial);
418 return d->to;
419}
420
422{
423 Q_D(QQuickDial);
424 if (qFuzzyCompare(d->to, to))
425 return;
426
427 d->to = to;
428 d->updateAllValuesAreInteger();
429 emit toChanged();
430 if (isComponentComplete()) {
431 setValue(d->value);
432 d->updatePosition();
433 }
434}
435
445{
446 Q_D(const QQuickDial);
447 return d->value;
448}
449
451{
452 Q_D(QQuickDial);
454 value = d->from > d->to ? qBound(d->to, value, d->from) : qBound(d->from, value, d->to);
455
456 if (qFuzzyCompare(d->value, value))
457 return;
458
459 d->value = value;
460 d->updatePosition();
462}
463
476{
477 Q_D(const QQuickDial);
478 return d->position;
479}
480
493{
494 Q_D(const QQuickDial);
495 return d->angle;
496}
497
517{
518 Q_D(const QQuickDial);
519 return d->stepSize;
520}
521
523{
524 Q_D(QQuickDial);
525 if (qFuzzyCompare(d->stepSize, step))
526 return;
527
528 d->stepSize = step;
529 d->updateAllValuesAreInteger();
531}
532
533
547{
548 Q_D(const QQuickDial);
549 return d->startAngle;
550}
551
553{
554 Q_D(QQuickDial);
555 if (!d->componentComplete) {
556 // Binding evaluation order can cause warnings with certain combinations
557 // of start and end angles, so delay the actual setting until after component completion.
558 // Store the requested value in the existing member to avoid the need for an extra one.
559 d->startAngle = startAngle;
560 return;
561 }
562
563 if (qFuzzyCompare(d->startAngle, startAngle))
564 return;
565
566 // do not allow to change direction
567 if (startAngle >= d->endAngle) {
568 qmlWarning(this) << "startAngle (" << startAngle
569 << ") cannot be greater than or equal to endAngle (" << d->endAngle << ")";
570 return;
571 }
572
573 // Keep the interval around 0
574 if (startAngle <= -360.) {
575 qmlWarning(this) << "startAngle (" << startAngle << ") cannot be less than or equal to -360";
576 return;
577 }
578
579 // keep the interval [startAngle, endAngle] unique
580 if (startAngle < d->endAngle - 360.) {
581 qmlWarning(this) << "Difference between startAngle (" << startAngle
582 << ") and endAngle (" << d->endAngle << ") cannot be greater than 360."
583 << " Changing endAngle to avoid overlaps.";
584 d->endAngle = startAngle + 360.;
585 emit endAngleChanged();
586 }
587
588 d->startAngle = startAngle;
589 // changing the startAngle will change the angle
590 // if the value is kept constant
591 d->updatePosition();
592 emit startAngleChanged();
593}
594
608{
609 Q_D(const QQuickDial);
610 return d->endAngle;
611
612}
613
615{
616 Q_D(QQuickDial);
617 if (!d->componentComplete) {
618 // Binding evaluation order can cause warnings with certain combinations
619 // of start and end angles, so delay the actual setting until after component completion.
620 // Store the requested value in the existing member to avoid the need for an extra one.
621 d->endAngle = endAngle;
622 return;
623 }
624
625 if (qFuzzyCompare(d->endAngle, endAngle))
626 return;
627
628 if (endAngle <= d->startAngle) {
629 qmlWarning(this) << "endAngle (" << endAngle
630 << ") cannot be less than or equal to startAngle (" << d->startAngle << ")";
631 return;
632 }
633
634 // Keep the interval around 0
635 if (endAngle >= 720.) {
636 qmlWarning(this) << "endAngle (" << endAngle << ") cannot be greater than or equal to 720";
637 return;
638 }
639
640 // keep the interval [startAngle, endAngle] unique
641 if (endAngle > d->startAngle + 360.) {
642 qmlWarning(this) << "Difference between startAngle (" << d->startAngle
643 << ") and endAngle (" << endAngle << ") cannot be greater than 360."
644 << " Changing startAngle to avoid overlaps.";
645 d->startAngle = endAngle - 360.;
646 emit startAngleChanged();
647 }
648
649 d->endAngle = endAngle;
650 // changing the startAngle will change the angle
651 // if the value is kept constant
652 d->updatePosition();
653 emit endAngleChanged();
654}
655
672{
673 Q_D(const QQuickDial);
674 return d->snapMode;
675}
676
678{
679 Q_D(QQuickDial);
680 if (d->snapMode == mode)
681 return;
682
683 d->snapMode = mode;
685}
686
698{
699 Q_D(const QQuickDial);
700 return d->inputMode;
701}
702
704{
705 Q_D(QQuickDial);
706 if (d->inputMode == mode)
707 return;
708
709 d->inputMode = mode;
710 emit inputModeChanged();
711}
712
732{
733 Q_D(const QQuickDial);
734 return d->wrap;
735}
736
738{
739 Q_D(QQuickDial);
740 if (d->wrap == wrap)
741 return;
742
743 d->wrap = wrap;
745}
746
766{
767 Q_D(const QQuickDial);
768 return d->pressed;
769}
770
771void QQuickDial::setPressed(bool pressed)
772{
773 Q_D(QQuickDial);
774 if (d->pressed == pressed)
775 return;
776
777 d->pressed = pressed;
778 setAccessibleProperty("pressed", pressed);
780}
781
792{
793 QQuickDialPrivate *d = const_cast<QQuickDialPrivate *>(d_func());
794 if (!d->handle)
795 d->executeHandle();
796 return d->handle;
797}
798
800{
801 Q_D(QQuickDial);
802 if (handle == d->handle)
803 return;
804
806
807 if (!d->handle.isExecuting())
808 d->cancelHandle();
809
811 d->handle = handle;
812 if (d->handle && !d->handle->parentItem())
813 d->handle->setParentItem(this);
814 if (!d->handle.isExecuting())
816}
817
830{
831 Q_D(const QQuickDial);
832 return d->live;
833}
834
835void QQuickDial::setLive(bool live)
836{
837 Q_D(QQuickDial);
838 if (d->live == live)
839 return;
840
841 d->live = live;
842 emit liveChanged();
843}
844
853{
854 Q_D(QQuickDial);
855 qreal step = qFuzzyIsNull(d->stepSize) ? 0.1 : d->stepSize;
856 setValue(d->value + step);
857}
858
867{
868 Q_D(QQuickDial);
869 qreal step = qFuzzyIsNull(d->stepSize) ? 0.1 : d->stepSize;
870 setValue(d->value - step);
871}
872
874{
875 Q_D(QQuickDial);
876 const qreal oldValue = d->value;
877 switch (event->key()) {
878 case Qt::Key_Left:
879 case Qt::Key_Down:
880 setPressed(true);
881 if (isMirrored())
882 increase();
883 else
884 decrease();
885 break;
886
887 case Qt::Key_Right:
888 case Qt::Key_Up:
889 setPressed(true);
890 if (isMirrored())
891 decrease();
892 else
893 increase();
894 break;
895
896 case Qt::Key_Home:
897 setPressed(true);
898 setValue(isMirrored() ? d->to : d->from);
899 break;
900
901 case Qt::Key_End:
902 setPressed(true);
903 setValue(isMirrored() ? d->from : d->to);
904 break;
905
906 default:
907 event->ignore();
909 break;
910 }
911 if (!qFuzzyCompare(d->value, oldValue))
912 emit moved();
913}
914
920
922{
923 Q_D(QQuickDial);
925 d->handleMove(event->position(), event->timestamp());
926 setKeepMouseGrab(true);
927}
928
929#if QT_CONFIG(quicktemplates2_multitouch)
931{
932 Q_D(QQuickDial);
933 switch (event->type()) {
935 for (const QTouchEvent::TouchPoint &point : event->points()) {
936 if (!d->acceptTouch(point))
937 continue;
938
939 switch (point.state()) {
941 if (!keepTouchGrab()) {
942 bool overXDragThreshold = QQuickWindowPrivate::dragOverThreshold(point.position().x() - d->pressPoint.x(), Qt::XAxis, &point);
943 setKeepTouchGrab(overXDragThreshold);
944
945 if (!overXDragThreshold) {
946 bool overYDragThreshold = QQuickWindowPrivate::dragOverThreshold(point.position().y() - d->pressPoint.y(), Qt::YAxis, &point);
947 setKeepTouchGrab(overYDragThreshold);
948 }
949 }
950 if (keepTouchGrab())
951 d->handleMove(point.position(), event->timestamp());
952 break;
953
954 default:
956 break;
957 }
958 }
959 break;
960
961 default:
963 break;
964 }
965}
966#endif
967
968#if QT_CONFIG(wheelevent)
969void QQuickDial::wheelEvent(QWheelEvent *event)
970{
971 Q_D(QQuickDial);
972 QQuickControl::wheelEvent(event);
973 if (d->wheelEnabled) {
974 const qreal oldValue = d->value;
975 const QPointF angle = event->angleDelta();
976 const qreal delta = (qFuzzyIsNull(angle.y()) ? angle.x() : (event->inverted() ? -angle.y() : angle.y())) / int(QWheelEvent::DefaultDeltasPerStep);
977 const qreal step = qFuzzyIsNull(d->stepSize) ? 0.1 : d->stepSize;
978 setValue(oldValue + step * delta);
979 event->setAccepted(!qFuzzyCompare(d->value, oldValue));
980 }
981}
982#endif
983
989
991{
992 Q_D(QQuickDial);
993 d->executeHandle(true);
995
996 // Set the (delayed) start and end angles, if necessary (see the setters for more info).
997 if (!qFuzzyCompare(d->startAngle, defaultStartAngle)) {
998 const qreal startAngle = d->startAngle;
999 // Temporarily set it to something else so that it sees that it has changed.
1000 d->startAngle = defaultStartAngle;
1002 }
1003
1004 if (!qFuzzyCompare(d->endAngle, defaultEndAngle)) {
1005 const qreal endAngle = d->endAngle;
1006 d->endAngle = defaultEndAngle;
1008 }
1009
1010 setValue(d->value);
1011 d->updatePosition();
1012}
1013
1014#if QT_CONFIG(accessibility)
1015void QQuickDial::accessibilityActiveChanged(bool active)
1016{
1017 QQuickControl::accessibilityActiveChanged(active);
1018
1019 Q_D(QQuickDial);
1020 if (active)
1021 setAccessibleProperty("pressed", d->pressed);
1022}
1023
1024QAccessible::Role QQuickDial::accessibleRole() const
1025{
1026 return QAccessible::Dial;
1027}
1028#endif
1029
1031
1032#include "moc_qquickdial_p.cpp"
The QEventPoint class provides information about a point in a QPointerEvent.
Definition qeventpoint.h:20
@ TouchUpdate
Definition qcoreevent.h:242
The QKeyEvent class describes a key event.
Definition qevent.h:424
static constexpr Policy Preferred
\inmodule QtGui
Definition qevent.h:196
\inmodule QtCore\reentrant
Definition qpoint.h:217
constexpr qreal x() const noexcept
Returns the x coordinate of this point.
Definition qpoint.h:343
constexpr qreal y() const noexcept
Returns the y coordinate of this point.
Definition qpoint.h:348
virtual bool handlePress(const QPointF &point, ulong timestamp)
static void hideOldItem(QQuickItem *item)
virtual void handleUngrab()
virtual bool handleRelease(const QPointF &point, ulong timestamp)
static void warnIfCustomizationNotSupported(QObject *control, QQuickItem *item, const QString &propertyName)
virtual bool handleMove(const QPointF &point, ulong timestamp)
void componentComplete() override
Invoked after the root component that caused this instantiation has completed construction.
void mousePressEvent(QMouseEvent *event) override
This event handler can be reimplemented in a subclass to receive mouse press events for an item.
bool setAccessibleProperty(const char *propertyName, const QVariant &value)
bool isMirrored() const
\qmlproperty bool QtQuick.Controls::Control::mirrored \readonly
virtual void mirrorChange()
QQuickDeferredPointer< QQuickItem > handle
void executeHandle(bool complete=false)
bool handlePress(const QPointF &point, ulong timestamp) override
bool handleRelease(const QPointF &point, ulong timestamp) override
void maybeEmitWrapAround(qreal pos)
qreal linearPositionAt(const QPointF &point) const
void handleUngrab() override
qreal snapPosition(qreal position) const
bool isHorizontalOrVertical() const
qreal positionAt(const QPointF &point) const
bool isLargeChange(qreal proposedPosition) const
qreal valueAt(qreal position) const
void setPosition(qreal position)
qreal circularPositionAt(const QPointF &point) const
void updateAllValuesAreInteger()
QQuickDial::InputMode inputMode
QQuickDial::SnapMode snapMode
bool handleMove(const QPointF &point, ulong timestamp) override
void setEndAngle(qreal endAngle)
InputMode inputMode
void componentComplete() override
Invoked after the root component that caused this instantiation has completed construction.
void keyPressEvent(QKeyEvent *event) override
This event handler can be reimplemented in a subclass to receive key press events for an item.
void setInputMode(InputMode mode)
void decrease()
\qmlmethod void QtQuick.Controls::Dial::decrease()
void valueChanged()
void setStepSize(qreal step)
void stepSizeChanged()
void snapModeChanged()
qreal stepSize
SnapMode snapMode
QQuickItem * handle
void setHandle(QQuickItem *handle)
bool isPressed() const
\qmlproperty bool QtQuick.Controls::Dial::pressed
void setSnapMode(SnapMode mode)
void increase()
\qmlmethod void QtQuick.Controls::Dial::increase()
void setLive(bool live)
void mirrorChange() override
void setValue(qreal value)
qreal position
QQuickDial(QQuickItem *parent=nullptr)
void setPressed(bool pressed)
void setTo(qreal to)
void setStartAngle(qreal startAngle)
qreal endAngle
void setFrom(qreal from)
void wrapChanged()
qreal startAngle
void angleChanged()
void pressedChanged()
void toChanged()
void keyReleaseEvent(QKeyEvent *event) override
This event handler can be reimplemented in a subclass to receive key release events for an item.
void setWrap(bool wrap)
void fromChanged()
void handleChanged()
void mousePressEvent(QMouseEvent *event) override
This event handler can be reimplemented in a subclass to receive mouse press events for an item.
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
Definition qquickitem.h:63
void setKeepTouchGrab(bool)
Sets whether the touch points grabbed by this item should remain exclusively with this item.
virtual void keyPressEvent(QKeyEvent *event)
This event handler can be reimplemented in a subclass to receive key press events for an item.
void setAcceptTouchEvents(bool accept)
If enabled is true, this sets the item to accept touch events; otherwise, touch events are not accept...
void setAcceptedMouseButtons(Qt::MouseButtons buttons)
Sets the mouse buttons accepted by this item to buttons.
bool keepTouchGrab() const
Returns whether the touch points grabbed by this item should exclusively remain with this item.
bool isComponentComplete() const
Returns true if construction of the QML component is complete; otherwise returns false.
void setKeepMouseGrab(bool)
Sets whether the mouse input should remain exclusively with this item.
virtual void touchEvent(QTouchEvent *event)
This event handler can be reimplemented in a subclass to receive touch events for an item.
virtual void keyReleaseEvent(QKeyEvent *event)
This event handler can be reimplemented in a subclass to receive key release events for an item.
void setActiveFocusOnTab(bool)
static bool dragOverThreshold(qreal d, Qt::Axis axis, const QEventPoint *tp, int startDragThreshold=-1)
The QTouchEvent class contains parameters that describe a touch event.
Definition qevent.h:917
Combined button and popup list for selecting options.
@ LeftButton
Definition qnamespace.h:58
@ ArrowCursor
@ Key_Right
Definition qnamespace.h:679
@ Key_Left
Definition qnamespace.h:677
@ Key_Up
Definition qnamespace.h:678
@ Key_Down
Definition qnamespace.h:680
@ Key_Home
Definition qnamespace.h:675
@ Key_End
Definition qnamespace.h:676
@ XAxis
@ YAxis
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
bool qFuzzyCompare(qfloat16 p1, qfloat16 p2) noexcept
Definition qfloat16.h:333
bool qFuzzyIsNull(qfloat16 f) noexcept
Definition qfloat16.h:349
int qRound(qfloat16 d) noexcept
Definition qfloat16.h:327
#define M_PI
Definition qmath.h:209
constexpr const T & qBound(const T &min, const T &val, const T &max)
Definition qminmax.h:44
constexpr T qAbs(const T &t)
Definition qnumeric.h:328
n void setPosition(void) \n\
GLuint64 GLenum void * handle
GLenum mode
GLint GLsizei GLsizei height
GLsizei range
GLint GLsizei width
GLfloat angle
struct _cl_event * event
GLfixed GLfixed GLint GLint GLfixed points
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
GLfloat GLfloat GLfloat alpha
Definition qopenglext.h:418
Q_QML_EXPORT QQmlInfo qmlWarning(const QObject *me)
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
void quickCancelDeferred(QObject *object, const QString &property)
void quickCompleteDeferred(QObject *object, const QString &property, QQuickDeferredPointer< T > &delegate)
void quickBeginDeferred(QObject *object, const QString &property, QQuickDeferredPointer< T > &delegate)
static const qreal defaultStartAngle
static const qreal defaultEndAngle
static bool areRepresentableAsInteger(Real... numbers)
QT_BEGIN_NAMESPACE constexpr qreal toUserAngleDeg(qreal logicAngleRad)
Circular dial that is rotated to set a value.
static QT_BEGIN_NAMESPACE QAsn1Element wrap(quint8 type, const QAsn1Element &child)
#define QStringLiteral(str)
#define emit
static QString handleName()
unsigned long ulong
Definition qtypes.h:35
double qreal
Definition qtypes.h:187
item setCursor(Qt::IBeamCursor)
[1]