Qt 6.x
The Qt SDK
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
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
159{
161}
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
255{
257}
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
328{
329 Q_Q(QQuickDial);
331}
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
352{
354}
355
357{
358 Q_Q(QQuickDial);
359
360 if (wrap && isLargeChange(pos))
362}
363
366{
369#if QT_CONFIG(quicktemplates2_multitouch)
371#endif
372#if QT_CONFIG(cursor)
374#endif
375}
376
385{
386 Q_D(const QQuickDial);
387 return d->from;
388}
389
391{
392 Q_D(QQuickDial);
393 if (qFuzzyCompare(d->from, from))
394 return;
395
396 d->from = from;
398 d->updateAllValuesAreInteger();
399 if (isComponentComplete()) {
400 setValue(d->value);
401 d->updatePosition();
402 }
403}
404
414{
415 Q_D(const QQuickDial);
416 return d->to;
417}
418
420{
421 Q_D(QQuickDial);
422 if (qFuzzyCompare(d->to, to))
423 return;
424
425 d->to = to;
426 d->updateAllValuesAreInteger();
427 emit toChanged();
428 if (isComponentComplete()) {
429 setValue(d->value);
430 d->updatePosition();
431 }
432}
433
443{
444 Q_D(const QQuickDial);
445 return d->value;
446}
447
449{
450 Q_D(QQuickDial);
452 value = d->from > d->to ? qBound(d->to, value, d->from) : qBound(d->from, value, d->to);
453
454 if (qFuzzyCompare(d->value, value))
455 return;
456
457 d->value = value;
458 d->updatePosition();
460}
461
474{
475 Q_D(const QQuickDial);
476 return d->position;
477}
478
491{
492 Q_D(const QQuickDial);
493 return d->angle;
494}
495
515{
516 Q_D(const QQuickDial);
517 return d->stepSize;
518}
519
521{
522 Q_D(QQuickDial);
523 if (qFuzzyCompare(d->stepSize, step))
524 return;
525
526 d->stepSize = step;
527 d->updateAllValuesAreInteger();
529}
530
531
545{
546 Q_D(const QQuickDial);
547 return d->startAngle;
548}
549
551{
552 Q_D(QQuickDial);
553 if (!d->componentComplete) {
554 // Binding evaluation order can cause warnings with certain combinations
555 // of start and end angles, so delay the actual setting until after component completion.
556 // Store the requested value in the existing member to avoid the need for an extra one.
557 d->startAngle = startAngle;
558 return;
559 }
560
561 if (qFuzzyCompare(d->startAngle, startAngle))
562 return;
563
564 // do not allow to change direction
565 if (startAngle >= d->endAngle) {
566 qmlWarning(this) << "startAngle (" << startAngle
567 << ") cannot be greater than or equal to endAngle (" << d->endAngle << ")";
568 return;
569 }
570
571 // Keep the interval around 0
572 if (startAngle <= -360.) {
573 qmlWarning(this) << "startAngle (" << startAngle << ") cannot be less than or equal to -360";
574 return;
575 }
576
577 // keep the interval [startAngle, endAngle] unique
578 if (startAngle < d->endAngle - 360.) {
579 qmlWarning(this) << "Difference between startAngle (" << startAngle
580 << ") and endAngle (" << d->endAngle << ") cannot be greater than 360."
581 << " Changing endAngle to avoid overlaps.";
582 d->endAngle = startAngle + 360.;
583 emit endAngleChanged();
584 }
585
586 d->startAngle = startAngle;
587 // changing the startAngle will change the angle
588 // if the value is kept constant
589 d->updatePosition();
590 emit startAngleChanged();
591}
592
606{
607 Q_D(const QQuickDial);
608 return d->endAngle;
609
610}
611
613{
614 Q_D(QQuickDial);
615 if (!d->componentComplete) {
616 // Binding evaluation order can cause warnings with certain combinations
617 // of start and end angles, so delay the actual setting until after component completion.
618 // Store the requested value in the existing member to avoid the need for an extra one.
619 d->endAngle = endAngle;
620 return;
621 }
622
623 if (qFuzzyCompare(d->endAngle, endAngle))
624 return;
625
626 if (endAngle <= d->startAngle) {
627 qmlWarning(this) << "endAngle (" << endAngle
628 << ") cannot be less than or equal to startAngle (" << d->startAngle << ")";
629 return;
630 }
631
632 // Keep the interval around 0
633 if (endAngle >= 720.) {
634 qmlWarning(this) << "endAngle (" << endAngle << ") cannot be greater than or equal to 720";
635 return;
636 }
637
638 // keep the interval [startAngle, endAngle] unique
639 if (endAngle > d->startAngle + 360.) {
640 qmlWarning(this) << "Difference between startAngle (" << d->startAngle
641 << ") and endAngle (" << endAngle << ") cannot be greater than 360."
642 << " Changing startAngle to avoid overlaps.";
643 d->startAngle = endAngle - 360.;
644 emit startAngleChanged();
645 }
646
647 d->endAngle = endAngle;
648 // changing the startAngle will change the angle
649 // if the value is kept constant
650 d->updatePosition();
651 emit endAngleChanged();
652}
653
670{
671 Q_D(const QQuickDial);
672 return d->snapMode;
673}
674
676{
677 Q_D(QQuickDial);
678 if (d->snapMode == mode)
679 return;
680
681 d->snapMode = mode;
683}
684
696{
697 Q_D(const QQuickDial);
698 return d->inputMode;
699}
700
702{
703 Q_D(QQuickDial);
704 if (d->inputMode == mode)
705 return;
706
707 d->inputMode = mode;
708 emit inputModeChanged();
709}
710
730{
731 Q_D(const QQuickDial);
732 return d->wrap;
733}
734
736{
737 Q_D(QQuickDial);
738 if (d->wrap == wrap)
739 return;
740
741 d->wrap = wrap;
743}
744
764{
765 Q_D(const QQuickDial);
766 return d->pressed;
767}
768
769void QQuickDial::setPressed(bool pressed)
770{
771 Q_D(QQuickDial);
772 if (d->pressed == pressed)
773 return;
774
775 d->pressed = pressed;
776 setAccessibleProperty("pressed", pressed);
778}
779
790{
791 QQuickDialPrivate *d = const_cast<QQuickDialPrivate *>(d_func());
792 if (!d->handle)
793 d->executeHandle();
794 return d->handle;
795}
796
798{
799 Q_D(QQuickDial);
800 if (handle == d->handle)
801 return;
802
804
805 if (!d->handle.isExecuting())
806 d->cancelHandle();
807
809 d->handle = handle;
810 if (d->handle && !d->handle->parentItem())
811 d->handle->setParentItem(this);
812 if (!d->handle.isExecuting())
814}
815
828{
829 Q_D(const QQuickDial);
830 return d->live;
831}
832
833void QQuickDial::setLive(bool live)
834{
835 Q_D(QQuickDial);
836 if (d->live == live)
837 return;
838
839 d->live = live;
840 emit liveChanged();
841}
842
851{
852 Q_D(QQuickDial);
853 qreal step = qFuzzyIsNull(d->stepSize) ? 0.1 : d->stepSize;
854 setValue(d->value + step);
855}
856
865{
866 Q_D(QQuickDial);
867 qreal step = qFuzzyIsNull(d->stepSize) ? 0.1 : d->stepSize;
868 setValue(d->value - step);
869}
870
872{
873 Q_D(QQuickDial);
874 const qreal oldValue = d->value;
875 switch (event->key()) {
876 case Qt::Key_Left:
877 case Qt::Key_Down:
878 setPressed(true);
879 if (isMirrored())
880 increase();
881 else
882 decrease();
883 break;
884
885 case Qt::Key_Right:
886 case Qt::Key_Up:
887 setPressed(true);
888 if (isMirrored())
889 decrease();
890 else
891 increase();
892 break;
893
894 case Qt::Key_Home:
895 setPressed(true);
896 setValue(isMirrored() ? d->to : d->from);
897 break;
898
899 case Qt::Key_End:
900 setPressed(true);
901 setValue(isMirrored() ? d->from : d->to);
902 break;
903
904 default:
905 event->ignore();
907 break;
908 }
909 if (!qFuzzyCompare(d->value, oldValue))
910 emit moved();
911}
912
914{
916 setPressed(false);
917}
918
920{
921 Q_D(QQuickDial);
923 d->handleMove(event->position(), event->timestamp());
924 setKeepMouseGrab(true);
925}
926
927#if QT_CONFIG(quicktemplates2_multitouch)
929{
930 Q_D(QQuickDial);
931 switch (event->type()) {
933 for (const QTouchEvent::TouchPoint &point : event->points()) {
934 if (!d->acceptTouch(point))
935 continue;
936
937 switch (point.state()) {
939 if (!keepTouchGrab()) {
940 bool overXDragThreshold = QQuickWindowPrivate::dragOverThreshold(point.position().x() - d->pressPoint.x(), Qt::XAxis, &point);
941 setKeepTouchGrab(overXDragThreshold);
942
943 if (!overXDragThreshold) {
944 bool overYDragThreshold = QQuickWindowPrivate::dragOverThreshold(point.position().y() - d->pressPoint.y(), Qt::YAxis, &point);
945 setKeepTouchGrab(overYDragThreshold);
946 }
947 }
948 if (keepTouchGrab())
949 d->handleMove(point.position(), event->timestamp());
950 break;
951
952 default:
954 break;
955 }
956 }
957 break;
958
959 default:
961 break;
962 }
963}
964#endif
965
966#if QT_CONFIG(wheelevent)
967void QQuickDial::wheelEvent(QWheelEvent *event)
968{
969 Q_D(QQuickDial);
970 QQuickControl::wheelEvent(event);
971 if (d->wheelEnabled) {
972 const qreal oldValue = d->value;
973 const QPointF angle = event->angleDelta();
974 const qreal delta = (qFuzzyIsNull(angle.y()) ? angle.x() : (event->inverted() ? -angle.y() : angle.y())) / int(QWheelEvent::DefaultDeltasPerStep);
975 const qreal step = qFuzzyIsNull(d->stepSize) ? 0.1 : d->stepSize;
976 setValue(oldValue + step * delta);
977 event->setAccepted(!qFuzzyCompare(d->value, oldValue));
978 }
979}
980#endif
981
983{
986}
987
989{
990 Q_D(QQuickDial);
991 d->executeHandle(true);
993
994 // Set the (delayed) start and end angles, if necessary (see the setters for more info).
995 if (!qFuzzyCompare(d->startAngle, defaultStartAngle)) {
996 const qreal startAngle = d->startAngle;
997 // Temporarily set it to something else so that it sees that it has changed.
998 d->startAngle = defaultStartAngle;
1000 }
1001
1002 if (!qFuzzyCompare(d->endAngle, defaultEndAngle)) {
1003 const qreal endAngle = d->endAngle;
1004 d->endAngle = defaultEndAngle;
1006 }
1007
1008 setValue(d->value);
1009 d->updatePosition();
1010}
1011
1012#if QT_CONFIG(accessibility)
1013void QQuickDial::accessibilityActiveChanged(bool active)
1014{
1015 QQuickControl::accessibilityActiveChanged(active);
1016
1017 Q_D(QQuickDial);
1018 if (active)
1019 setAccessibleProperty("pressed", d->pressed);
1020}
1021
1022QAccessible::Role QQuickDial::accessibleRole() const
1023{
1024 return QAccessible::Dial;
1025}
1026#endif
1027
1029
1030#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:423
\inmodule QtGui
Definition qevent.h:195
\inmodule QtCore\reentrant
Definition qpoint.h:214
constexpr qreal x() const noexcept
Returns the x coordinate of this point.
Definition qpoint.h:333
constexpr qreal y() const noexcept
Returns the y coordinate of this point.
Definition qpoint.h:338
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:64
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:916
Combined button and popup list for selecting options.
@ LeftButton
Definition qnamespace.h:57
@ ArrowCursor
@ Key_Right
Definition qnamespace.h:674
@ Key_Left
Definition qnamespace.h:672
@ Key_Up
Definition qnamespace.h:673
@ Key_Down
Definition qnamespace.h:675
@ Key_Home
Definition qnamespace.h:670
@ Key_End
Definition qnamespace.h:671
@ XAxis
@ YAxis
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
bool qFuzzyCompare(qfloat16 p1, qfloat16 p2) noexcept
Definition qfloat16.h:287
bool qFuzzyIsNull(qfloat16 f) noexcept
Definition qfloat16.h:303
int qRound(qfloat16 d) noexcept
Definition qfloat16.h:281
#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:30
double qreal
Definition qtypes.h:92
item setCursor(Qt::IBeamCursor)
[1]
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent