Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qquickpointerhandler.cpp
Go to the documentation of this file.
1// Copyright (C) 2018 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
6#include <QtQuick/private/qquickitem_p.h>
7#include <QtQuick/private/qquickhandlerpoint_p.h>
8#include <QtQuick/private/qquickdeliveryagent_p_p.h>
9#include <QtGui/private/qinputdevice_p.h>
10
12
13Q_LOGGING_CATEGORY(lcPointerHandlerDispatch, "qt.quick.handler.dispatch")
14Q_LOGGING_CATEGORY(lcPointerHandlerGrab, "qt.quick.handler.grab")
15Q_LOGGING_CATEGORY(lcPointerHandlerActive, "qt.quick.handler.active")
16Q_DECLARE_LOGGING_CATEGORY(lcHandlerParent)
17
45{
46}
47
49 : QObject(dd, parent)
50{
51 // When a handler is created in QML, the given parent is null, and we
52 // depend on QQuickItemPrivate::data_append() later when it's added to an
53 // item's DefaultProperty data property. But when a handler is created in
54 // C++ with a parent item, data_append() won't be called, and the caller
55 // shouldn't have to worry about it either.
56 if (parent)
58}
59
61{
62 QQuickItem *parItem = parentItem();
63 if (parItem) {
65 p->extra.value().pointerHandlers.removeOne(this);
66 }
67}
68
87{
88 Q_D(const QQuickPointerHandler);
89 return d->m_margin;
90}
91
92void QQuickPointerHandler::setMargin(qreal pointDistanceThreshold)
93{
95 if (d->m_margin == pointDistanceThreshold)
96 return;
97
98 d->m_margin = pointDistanceThreshold;
100}
101
114{
115 Q_D(const QQuickPointerHandler);
116 if (d->dragThreshold < 0)
117 return qApp->styleHints()->startDragDistance();
118 return d->dragThreshold;
119}
120
122{
124 if (d->dragThreshold == t)
125 return;
126
127 if (t > std::numeric_limits<qint16>::max())
128 qWarning() << "drag threshold cannot exceed" << std::numeric_limits<qint16>::max();
129 d->dragThreshold = qint16(t);
130 emit dragThresholdChanged();
131}
132
134{
136 if (d->dragThreshold < 0)
137 return;
138
139 d->dragThreshold = -1;
140 emit dragThresholdChanged();
141}
142
184#if QT_CONFIG(cursor)
185Qt::CursorShape QQuickPointerHandler::cursorShape() const
186{
187 Q_D(const QQuickPointerHandler);
188 return d->cursorShape;
189}
190
191void QQuickPointerHandler::setCursorShape(Qt::CursorShape shape)
192{
194 if (d->cursorSet && shape == d->cursorShape)
195 return;
196 d->cursorShape = shape;
197 d->cursorSet = true;
198 if (auto *parent = parentItem()) {
200 itemPriv->hasCursorHandler = true;
201 itemPriv->setHasCursorInChild(true);
202 }
203 emit cursorShapeChanged();
204}
205
206void QQuickPointerHandler::resetCursorShape()
207{
209 if (!d->cursorSet)
210 return;
211 d->cursorShape = Qt::ArrowCursor;
212 d->cursorSet = false;
213 if (auto *parent = parentItem()) {
215 itemPriv->hasCursorHandler = false;
216 itemPriv->setHasCursorInChild(itemPriv->hasCursor);
217 }
218 emit cursorShapeChanged();
219}
220
221bool QQuickPointerHandler::isCursorShapeExplicitlySet() const
222{
223 Q_D(const QQuickPointerHandler);
224 return d->cursorSet;
225}
226#endif
227
243{
245 qCDebug(lcPointerHandlerGrab) << point << transition << grabber;
246 if (grabber == this) {
247 bool wasCanceled = false;
248 switch (transition) {
251 break;
254 wasCanceled = true; // the grab was stolen by something else
258 setActive(false);
259 point.setAccepted(false);
260 if (auto par = parentItem()) {
261 Q_D(const QQuickPointerHandler);
262 par->setKeepMouseGrab(d->hadKeepMouseGrab);
263 par->setKeepTouchGrab(d->hadKeepTouchGrab);
264 }
265 break;
267 // Passive grab is still there, but we won't receive point updates right now.
268 // No need to notify about this.
269 return;
270 }
271 if (wasCanceled)
272 emit canceled(point);
273 emit grabChanged(transition, point);
274 }
275}
276
293{
294 qCDebug(lcPointerHandlerGrab) << this << point << grab << "via"
296 if (grab) {
297 event->addPassiveGrabber(point, this);
298 } else {
299 event->removePassiveGrabber(point, this);
300 }
301}
302
315{
316 QQuickPointerHandler *existingPhGrabber = qobject_cast<QQuickPointerHandler *>(event->exclusiveGrabber(point));
317 return approveGrabTransition(event, point, this) &&
318 (existingPhGrabber ? existingPhGrabber->approveGrabTransition(event, point, this) : true);
319}
320
328{
329 Q_D(const QQuickPointerHandler);
330 bool allowed = false;
331 QObject* existingGrabber = event->exclusiveGrabber(point);
332 if (proposedGrabber == this) {
333 allowed = (existingGrabber == nullptr) || ((d->grabPermissions & CanTakeOverFromAnything) == CanTakeOverFromAnything);
334 if (existingGrabber) {
335 if (QQuickPointerHandler *existingPhGrabber = qobject_cast<QQuickPointerHandler *>(event->exclusiveGrabber(point))) {
336 if (!allowed && (d->grabPermissions & CanTakeOverFromHandlersOfDifferentType) &&
337 existingPhGrabber->metaObject()->className() != metaObject()->className())
338 allowed = true;
339 if (!allowed && (d->grabPermissions & CanTakeOverFromHandlersOfSameType) &&
340 existingPhGrabber->metaObject()->className() == metaObject()->className())
341 allowed = true;
342 } else if ((d->grabPermissions & CanTakeOverFromItems)) {
343 allowed = true;
344 QQuickItem * existingItemGrabber = qobject_cast<QQuickItem *>(event->exclusiveGrabber(point));
348 const bool isTouchMouse = (da && da->isDeliveringTouchAsMouse());
349 if (existingItemGrabber &&
350 ((existingItemGrabber->keepMouseGrab() &&
352 (existingItemGrabber->keepTouchGrab() && QQuickDeliveryAgentPrivate::isTouchEvent(event)))) {
353 allowed = false;
354 // If the handler wants to steal the exclusive grab from an Item, the Item can usually veto
355 // by having its keepMouseGrab flag set. But an exception is if that Item is a parent that
356 // normally filters events (such as a Flickable): it needs to be possible for e.g. a
357 // DragHandler to operate on an Item inside a Flickable. Flickable is aggressive about
358 // grabbing on press (for fear of missing updates), but DragHandler uses a passive grab
359 // at first and then expects to be able to steal the grab later on. It cannot respect
360 // Flickable's wishes in that case, because then it would never have a chance.
361 if (existingItemGrabber->keepMouseGrab() &&
362 existingItemGrabber->filtersChildMouseEvents() && existingItemGrabber->isAncestorOf(parentItem())) {
363 Q_ASSERT(da);
364 if (isTouchMouse && point.id() == da->touchMouseId) {
365 qCDebug(lcPointerHandlerGrab) << this << "steals touchpoint" << point.id()
366 << "despite parent touch-mouse grabber with keepMouseGrab=true" << existingItemGrabber;
367 allowed = true;
368 }
369 }
370 if (!allowed) {
371 qCDebug(lcPointerHandlerGrab) << this << "wants to grab point" << point.id()
372 << "but declines to steal from grabber" << existingItemGrabber
373 << "with keepMouseGrab=" << existingItemGrabber->keepMouseGrab()
374 << "keepTouchGrab=" << existingItemGrabber->keepTouchGrab();
375 }
376 }
377 }
378 }
379 } else {
380 // proposedGrabber is different: that means this instance will lose its grab
381 if (proposedGrabber) {
382 if ((d->grabPermissions & ApprovesTakeOverByAnything) == ApprovesTakeOverByAnything)
383 allowed = true;
384 if (!allowed && (d->grabPermissions & ApprovesTakeOverByHandlersOfDifferentType) &&
385 proposedGrabber->metaObject()->className() != metaObject()->className())
386 allowed = true;
387 if (!allowed && (d->grabPermissions & ApprovesTakeOverByHandlersOfSameType) &&
388 proposedGrabber->metaObject()->className() == metaObject()->className())
389 allowed = true;
390 if (!allowed && (d->grabPermissions & ApprovesTakeOverByItems) && proposedGrabber->inherits("QQuickItem"))
391 allowed = true;
392 } else {
393 if (d->grabPermissions & ApprovesCancellation)
394 allowed = true;
395 }
396 }
397 qCDebug(lcPointerHandlerGrab) << "point" << Qt::hex << point.id() << "permission" <<
398 QMetaEnum::fromType<GrabPermissions>().valueToKeys(grabPermissions()) <<
399 ':' << this << (allowed ? "approved from" : "denied from") <<
400 existingGrabber << "to" << proposedGrabber;
401 return allowed;
402}
403
437QQuickPointerHandler::GrabPermissions QQuickPointerHandler::grabPermissions() const
438{
439 Q_D(const QQuickPointerHandler);
440 return static_cast<QQuickPointerHandler::GrabPermissions>(d->grabPermissions);
441}
442
443void QQuickPointerHandler::setGrabPermissions(GrabPermissions grabPermission)
444{
446 if (d->grabPermissions == grabPermission)
447 return;
448
449 d->grabPermissions = grabPermission;
451}
452
457{
458}
459
465{
466 Q_D(const QQuickPointerHandler);
467 if (d->cursorSet) {
468 if (auto *parent = parentItem()) {
470 itemPriv->hasCursorHandler = true;
471 itemPriv->setHasCursorInChild(true);
472 }
473 }
474}
475
483{
484 Q_D(const QQuickPointerHandler);
485 return d->currentEvent;
486}
487
497{
498 if ((grab && ev->exclusiveGrabber(point) == this) || (!grab && ev->exclusiveGrabber(point) != this))
499 return true;
500 // TODO m_hadKeepMouseGrab m_hadKeepTouchGrab
501 bool allowed = true;
502 if (grab) {
503 allowed = canGrab(ev, point);
504 } else {
505 QQuickPointerHandler *existingPhGrabber = qobject_cast<QQuickPointerHandler *>(ev->exclusiveGrabber(point));
506 // Ask before allowing one handler to cancel another's grab
507 if (existingPhGrabber && existingPhGrabber != this && !existingPhGrabber->approveGrabTransition(ev, point, nullptr))
508 allowed = false;
509 }
510 qCDebug(lcPointerHandlerGrab) << point << (grab ? "grab" : "ungrab") << (allowed ? "allowed" : "forbidden") <<
511 ev->exclusiveGrabber(point) << "->" << (grab ? this : nullptr);
512 if (allowed)
513 ev->setExclusiveGrabber(point, grab ? this : nullptr);
514 return allowed;
515}
516
521{
522 qCDebug(lcPointerHandlerGrab) << point;
523 if (event->exclusiveGrabber(point) == this) {
524 event->setExclusiveGrabber(point, nullptr);
526 }
527 if (event->removePassiveGrabber(point, this))
529}
530
532{
533 return (target() ? target()->mapFromScene(point.scenePosition()) : point.scenePosition());
534}
535
543{
544 return parentContains(point.scenePosition());
545}
546
555bool QQuickPointerHandler::parentContains(const QPointF &scenePosition) const
556{
557 if (QQuickItem *par = parentItem()) {
558 if (par->window()) {
559 QRect windowGeometry = par->window()->geometry();
560 if (!par->window()->isTopLevel())
561 windowGeometry = QRect(QWindowPrivate::get(par->window())->globalPosition(), par->window()->size());
562 QPoint screenPosition = par->window()->mapToGlobal(scenePosition.toPoint());
563 if (!windowGeometry.contains(screenPosition))
564 return false;
565 }
566 QPointF p = par->mapFromScene(scenePosition);
567 qreal m = margin();
568 if (m > 0)
569 return p.x() >= -m && p.y() >= -m && p.x() <= par->width() + m && p.y() <= par->height() + m;
570 return par->contains(p);
571 } else if (parent() && parent()->inherits("QQuick3DModel")) {
572 // If the parent is from Qt Quick 3D, assume that
573 // bounds checking was already done, as part of picking.
574 return true;
575 }
576 return false;
577}
578
586{
587 Q_D(const QQuickPointerHandler);
588 return d->enabled;
589}
590
592{
594 if (d->enabled == enabled)
595 return;
596
597 d->enabled = enabled;
598 d->onEnabledChanged();
599
601}
602
615{
616 Q_D(const QQuickPointerHandler);
617 if (!d->targetExplicitlySet)
618 return parentItem();
619 return d->target;
620}
621
623{
625 d->targetExplicitlySet = true;
626 if (d->target == target)
627 return;
628
629 QQuickItem *oldTarget = d->target;
630 d->target = target;
631 onTargetChanged(oldTarget);
633}
634
657{
659}
660
662{
664 if (QObject::parent() == p)
665 return;
666
667 qCDebug(lcHandlerParent) << "reparenting handler" << this << ":" << parent() << "->" << p;
668 auto *oldParent = static_cast<QQuickItem *>(QObject::parent());
669 if (oldParent)
671 setParent(p);
672 if (p)
674 d->onParentChanged(oldParent, p);
675 emit parentChanged();
676}
677
685{
686 switch (e->type()) {
687 case QEvent::TouchCancel: {
688 auto te = static_cast<QTouchEvent *>(e);
689 for (int i = 0; i < te->pointCount(); ++i)
691 return true;
692 break;
693 }
694 default:
695 return QObject::event(e);
696 break;
697 }
698}
699
706{
708 bool wants = wantsPointerEvent(event);
709 qCDebug(lcPointerHandlerDispatch) << metaObject()->className() << objectName()
710 << "on" << parent()->metaObject()->className() << parent()->objectName()
711 << (wants ? "WANTS" : "DECLINES") << event;
712 d->currentEvent = event;
713 if (wants) {
715 d->lastEventTime = event->timestamp();
716 } else {
717#if QT_CONFIG(gestures)
718 if (event->type() != QEvent::NativeGesture)
719#endif
720 setActive(false);
721 for (int i = 0; i < event->pointCount(); ++i) {
722 auto &pt = event->point(i);
723 if (event->exclusiveGrabber(pt) == this && pt.state() != QEventPoint::Stationary)
724 event->setExclusiveGrabber(pt, nullptr);
725 }
726 }
727 d->currentEvent = nullptr;
729}
730
754{
755 Q_D(const QQuickPointerHandler);
757 return d->enabled;
758}
759
782{
784 bool ret = event->exclusiveGrabber(point) == this ||
785 event->passiveGrabbers(point).contains(this) || parentContains(point);
786 qCDebug(lcPointerHandlerDispatch) << Qt::hex << point.id() << "@" << point.scenePosition()
787 << metaObject()->className() << objectName() << ret;
788 return ret;
789}
790
802{
803 Q_D(const QQuickPointerHandler);
804 return d->active;
805}
806
808{
810 if (d->active != active) {
811 qCDebug(lcPointerHandlerActive) << this << d->active << "->" << active;
812 d->active = active;
815 }
816}
817
828{
830}
831
865 : grabPermissions(QQuickPointerHandler::CanTakeOverFromItems |
866 QQuickPointerHandler::CanTakeOverFromHandlersOfDifferentType |
867 QQuickPointerHandler::ApprovesTakeOverByAnything)
868 , cursorShape(Qt::ArrowCursor)
869 , enabled(true)
870 , active(false)
871 , targetExplicitlySet(false)
872 , hadKeepMouseGrab(false)
873 , hadKeepTouchGrab(false)
874 , cursorSet(false)
875{
876}
877
885template <typename TEventPoint>
887{
888 Q_Q(const QQuickPointerHandler);
889 QStyleHints *styleHints = qApp->styleHints();
890 bool overThreshold = qAbs(d) > q->dragThreshold();
891 const bool dragVelocityLimitAvailable = (styleHints->startDragVelocity() > 0);
892 if (!overThreshold && dragVelocityLimitAvailable) {
893 qreal velocity = qreal(axis == Qt::XAxis ? p.velocity().x() : p.velocity().y());
894 overThreshold |= qAbs(velocity) > styleHints->startDragVelocity();
895 }
896 return overThreshold;
897}
898
906{
907 Q_Q(const QQuickPointerHandler);
908 const float threshold = q->dragThreshold();
909 return qAbs(delta.x()) > threshold || qAbs(delta.y()) > threshold;
910}
911
920{
921 QPointF delta = point.scenePosition() - point.scenePressPosition();
922 return (dragOverThreshold(delta.x(), Qt::XAxis, point) ||
923 dragOverThreshold(delta.y(), Qt::YAxis, point));
924}
925
927{
929}
930
932
933#include "moc_qquickpointerhandler_p.cpp"
IOBluetoothDevice * device
The QEventPoint class provides information about a point in a QPointerEvent.
Definition qeventpoint.h:20
int id
the ID number of this event point.
Definition qeventpoint.h:25
QPointF scenePosition
the scene position of this point.
Definition qeventpoint.h:40
void setAccepted(bool accepted=true)
QPointF scenePressPosition
the scene position at which this point was pressed.
Definition qeventpoint.h:41
\inmodule QtCore
Definition qcoreevent.h:45
@ NativeGesture
Definition qcoreevent.h:246
@ TouchCancel
Definition qcoreevent.h:264
The QInputDevice class describes a device from which a QInputEvent originates.
Definition qlist.h:74
static QObjectPrivate * get(QObject *o)
Definition qobject_p.h:153
\inmodule QtCore
Definition qobject.h:90
QObject * parent() const
Returns a pointer to the parent object.
Definition qobject.h:311
QString objectName
the name of this object
Definition qobject.h:94
virtual bool event(QEvent *event)
This virtual function receives events to an object and should return true if the event e was recogniz...
Definition qobject.cpp:1363
void setParent(QObject *parent)
Makes the object a child of parent.
Definition qobject.cpp:2142
bool inherits(const char *classname) const
Returns true if this object is an instance of a class that inherits className or a QObject subclass t...
Definition qobject.h:313
\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
constexpr QPoint toPoint() const
Rounds the coordinates of this point to the nearest integer, and returns a QPoint object with the rou...
Definition qpoint.h:394
\inmodule QtCore\reentrant
Definition qpoint.h:23
A base class for pointer events.
Definition qevent.h:73
void setExclusiveGrabber(const QEventPoint &point, QObject *exclusiveGrabber)
Informs the delivery logic that the given exclusiveGrabber is to receive all future update events and...
Definition qevent.cpp:366
QObject * exclusiveGrabber(const QEventPoint &point) const
Returns the object which has been set to receive all future update events and the release event conta...
Definition qevent.cpp:348
GrabTransition
This enum represents a transition of exclusive or passive grab from one object (possibly nullptr) to ...
static QQuickPointingDeviceExtra * deviceExtra(const QInputDevice *device)
static QQuickDeliveryAgent * currentEventDeliveryAgent
static bool isTouchEvent(const QPointerEvent *ev)
static bool isMouseEvent(const QPointerEvent *ev)
static QQuickDeliveryAgent * currentOrItemDeliveryAgent(const QQuickItem *item)
virtual void removePointerHandler(QQuickPointerHandler *h)
void setHasCursorInChild(bool hasCursor)
QQuickDeliveryAgentPrivate * deliveryAgentPrivate()
virtual void addPointerHandler(QQuickPointerHandler *h)
static QQuickItemPrivate * get(QQuickItem *item)
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
Definition qquickitem.h:64
bool keepTouchGrab() const
Returns whether the touch points grabbed by this item should exclusively remain with this item.
bool filtersChildMouseEvents() const
Returns whether pointer events intended for this item's children should be filtered through this item...
bool keepMouseGrab() const
Returns whether mouse input should exclusively remain with this item.
bool isAncestorOf(const QQuickItem *child) const
Returns true if this item is an ancestor of child (i.e., if this item is child's parent,...
QQuickPointerHandlerPrivate()
\qmlsignal QtQuick::PointerHandler::grabChanged(PointerDevice::GrabTransition transition,...
static QVector< QObject * > & deviceDeliveryTargets(const QInputDevice *device)
bool dragOverThreshold(qreal d, Qt::Axis axis, const TEventPoint &p) const
Returns true if the movement delta d in pixels along the axis exceeds QQuickPointerHandler::dragThres...
virtual bool canGrab(QPointerEvent *event, const QEventPoint &point)
Check whether it's OK to take an exclusive grab of the point.
bool parentContains(const QEventPoint &point) const
Returns true if margin() > 0 and point is within the margin beyond QQuickItem::boundingRect(),...
QQuickItem * parentItem() const
\qmlproperty Item QtQuick::PointerHandler::parent
void handlePointerEvent(QPointerEvent *event)
QQuickPointerHandler(QQuickItem *parent=nullptr)
\qmltype PointerHandler \qmlabstract
void grabChanged(QPointingDevice::GrabTransition transition, QEventPoint point)
void cancelAllGrabs(QPointerEvent *event, QEventPoint &point)
Cancel any existing grab of the given point.
virtual bool wantsPointerEvent(QPointerEvent *event)
It is the responsibility of this function to decide whether the event could be relevant at all to thi...
void setMargin(qreal pointDistanceThreshold)
virtual bool approveGrabTransition(QPointerEvent *event, const QEventPoint &point, QObject *proposedGrabber)
Check this handler's rules to see if \l proposedGrabber will be allowed to take the exclusive grab.
virtual bool wantsEventPoint(const QPointerEvent *event, const QEventPoint &point)
Returns true if the given point (as part of event) could be relevant at all to this handler,...
void setPassiveGrab(QPointerEvent *event, const QEventPoint &point, bool grab=true)
Acquire or give up a passive grab of the given point, according to the grab state.
void setGrabPermissions(GrabPermissions grabPermissions)
virtual void onGrabChanged(QQuickPointerHandler *grabber, QPointingDevice::GrabTransition transition, QPointerEvent *event, QEventPoint &point)
Notification that the grab has changed in some way which is relevant to this handler.
void setParentItem(QQuickItem *p)
void componentComplete() override
Overridden from QQmlParserStatus to ensure that parentItem() sets its cursor if this handler's \l cur...
virtual void onTargetChanged(QQuickItem *oldTarget)
QPointF eventPos(const QEventPoint &point) const
virtual void handlePointerEventImpl(QPointerEvent *event)
This function can be overridden to implement whatever behavior a specific subclass is intended to hav...
void setEnabled(bool enabled)
void classBegin() override
Overridden only because QQmlParserStatus requires it.
void setTarget(QQuickItem *target)
bool setExclusiveGrab(QPointerEvent *ev, const QEventPoint &point, bool grab=true)
Acquire or give up the exclusive grab of the given point, according to the grab state,...
void canceled(QEventPoint point)
bool event(QEvent *) override
\inmodule QtCore\reentrant
Definition qrect.h:30
bool contains(const QRect &r, bool proper=false) const noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qrect.cpp:851
The QStyleHints class contains platform specific hints and settings. \inmodule QtGui.
Definition qstylehints.h:17
int startDragVelocity
the limit for the velocity, in pixels per second, that the mouse may be moved, with a button held dow...
Definition qstylehints.h:41
The QTouchEvent class contains parameters that describe a touch event.
Definition qevent.h:916
The QVector2D class represents a vector or vertex in 2D space.
Definition qvectornd.h:31
constexpr float y() const noexcept
Returns the y coordinate of this point.
Definition qvectornd.h:502
constexpr float x() const noexcept
Returns the x coordinate of this point.
Definition qvectornd.h:501
static QWindowPrivate * get(QWindow *window)
Definition qwindow_p.h:94
QPoint globalPosition() const
Definition qwindow.cpp:2847
#define this
Definition dialogs.cpp:9
double e
Combined button and popup list for selecting options.
QTextStream & hex(QTextStream &stream)
Calls QTextStream::setIntegerBase(16) on stream and returns stream.
CursorShape
@ ArrowCursor
@ XAxis
@ YAxis
#define Q_FALLTHROUGH()
#define qApp
#define qWarning
Definition qlogging.h:162
#define Q_LOGGING_CATEGORY(name,...)
#define qCDebug(category,...)
#define Q_DECLARE_LOGGING_CATEGORY(name)
return ret
constexpr T qAbs(const T &t)
Definition qnumeric.h:328
const GLfloat * m
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLenum target
struct _cl_event * event
GLdouble GLdouble t
Definition qopenglext.h:243
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
GLfloat GLfloat p
[1]
QQuickItem * qmlobject_cast< QQuickItem * >(QObject *object)
QQuickItem * qobject_cast< QQuickItem * >(QObject *o)
Definition qquickitem.h:483
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define emit
#define Q_UNUSED(x)
short qint16
Definition qtypes.h:42
double qreal
Definition qtypes.h:92
const char className[16]
[1]
Definition qwizard.cpp:100
obj metaObject() -> className()
QVector< QObject * > deliveryTargets
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent