Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qquickoverlay.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 "qquickcontrol_p_p.h"
5#include "qquickoverlay_p.h"
6#include "qquickoverlay_p_p.h"
8#include "qquickpopup_p_p.h"
9#include "qquickdrawer_p.h"
10#include "qquickdrawer_p_p.h"
12#include <QtQml/qqmlinfo.h>
13#include <QtQml/qqmlproperty.h>
14#include <QtQml/qqmlcomponent.h>
15#include <algorithm>
16
18
23
40{
42
44 popups.reserve(children.size());
45
46 for (auto it = children.crbegin(), end = children.crend(); it != end; ++it) {
47 QQuickPopup *popup = qobject_cast<QQuickPopup *>((*it)->parent());
48 if (popup)
49 popups += popup;
50 }
51
52 return popups;
53}
54
56{
58 std::sort(sorted.begin(), sorted.end(), [](const QQuickPopup *one, const QQuickPopup *another) {
59 return one->z() > another->z();
60 });
61 return sorted;
62}
63
65{
67}
68
70{
71 Q_Q(QQuickOverlay);
72 if (allDrawers.isEmpty())
73 return false;
74
75 // don't start dragging a drawer if a modal popup overlay is blocking (QTBUG-60602)
76 QQuickItem *item = q->childAt(pos.x(), pos.y());
77 if (item) {
78 const auto popups = stackingOrderPopups();
79 for (QQuickPopup *popup : popups) {
81 if (p->dimmer == item && popup->isVisible() && popup->isModal())
82 return false;
83 }
84 }
85
87 for (QQuickPopup *popup : drawers) {
88 QQuickDrawer *drawer = qobject_cast<QQuickDrawer *>(popup);
89 Q_ASSERT(drawer);
91 if (p->startDrag(event)) {
93 return true;
94 }
95 }
96
97 return false;
98}
99
101{
102 if (target) {
103 if (target->overlayEvent(source, event)) {
105 return true;
106 }
107 return false;
108 }
109
110 switch (event->type()) {
111 default: {
113 break;
114#if QT_CONFIG(quicktemplates2_multitouch)
118 case QEvent::TouchEnd:
119#endif
120 // allow non-modal popups to close themselves,
121 // and non-dimming modal popups to block the event
122 const auto popups = stackingOrderPopups();
123 for (QQuickPopup *popup : popups) {
124 if (popup->overlayEvent(source, event)) {
126 return true;
127 }
128 }
129 break;
130 }
131 }
132
133 event->ignore();
134 return false;
135}
136
138{
139 if (target)
140 return target->overlayEvent(source, event);
141 return false;
142}
143
145{
146 if (target) {
147 setMouseGrabberPopup(nullptr);
148 if (target->overlayEvent(source, event)) {
149 setMouseGrabberPopup(nullptr);
150 return true;
151 }
152 } else {
153 const auto popups = stackingOrderPopups();
154 for (QQuickPopup *popup : popups) {
155 if (popup->overlayEvent(source, event))
156 return true;
157 }
158 }
159 return false;
160}
161
163{
164 switch (event->type()) {
166 if (!target && startDrag(event, event->scenePosition()))
167 return true;
168 return handlePress(source, event, target);
173 default:
174 break;
175 }
176 return false;
177}
178
180{
181 switch (event->type()) {
185 if (target)
186 return target->overlayEvent(source, event);
187 return false;
188 default:
189 Q_UNREACHABLE(); // function must only be called on hover events
190 break;
191 }
192 return false;
193}
194
195#if QT_CONFIG(quicktemplates2_multitouch)
196bool QQuickOverlayPrivate::handleTouchEvent(QQuickItem *source, QTouchEvent *event, QQuickPopup *target)
197{
198 bool handled = false;
199 switch (event->type()) {
202 case QEvent::TouchEnd:
203 for (const QTouchEvent::TouchPoint &point : event->points()) {
204 switch (point.state()) {
206 if (!target && startDrag(event, point.scenePosition()))
207 handled = true;
208 else
209 handled |= handlePress(source, event, target);
210 break;
213 break;
216 break;
217 default:
218 break;
219 }
220 }
221 break;
222
223 default:
224 break;
225 }
226
227 return handled;
228}
229#endif
230
232{
233 Q_Q(QQuickOverlay);
234 allPopups += popup;
235 if (QQuickDrawer *drawer = qobject_cast<QQuickDrawer *>(popup)) {
236 allDrawers += drawer;
237 q->setVisible(!allDrawers.isEmpty() || !q->childItems().isEmpty());
238 }
239}
240
242{
243 Q_Q(QQuickOverlay);
244 allPopups.removeOne(popup);
245 if (allDrawers.removeOne(popup))
246 q->setVisible(!allDrawers.isEmpty() || !q->childItems().isEmpty());
247}
248
250{
251 if (popup && !popup->isVisible())
252 popup = nullptr;
253 mouseGrabberPopup = popup;
254}
255
257{
258 Q_Q(QQuickOverlay);
259 if (!window)
260 return;
261
262 QPointF pos;
263 QSizeF size = window->size();
264 qreal rotation = 0;
265
266 switch (window->contentOrientation()) {
269 size = window->size();
270 break;
272 rotation = 90;
273 pos = QPointF((size.width() - size.height()) / 2, -(size.width() - size.height()) / 2);
274 size.transpose();
275 break;
277 rotation = 180;
278 break;
280 rotation = 270;
281 pos = QPointF((size.width() - size.height()) / 2, -(size.width() - size.height()) / 2);
282 size.transpose();
283 break;
284 default:
285 break;
286 }
287
288 q->setSize(size);
289 q->setPosition(pos);
290 q->setRotation(rotation);
291}
292
295{
296 Q_D(QQuickOverlay);
297 setZ(1000001); // DefaultWindowDecoration+1
299#if QT_CONFIG(quicktemplates2_multitouch)
301#endif
303 setVisible(false);
304
305 if (parent) {
306 d->updateGeometry();
308 if (QQuickWindow *window = parent->window()) {
311 }
312 }
313}
314
316{
317 Q_D(QQuickOverlay);
320}
321
323{
324 Q_D(const QQuickOverlay);
325 return d->modal;
326}
327
329{
330 Q_D(QQuickOverlay);
331 if (d->modal == modal)
332 return;
333
334 d->modal = modal;
336}
337
339{
340 Q_D(const QQuickOverlay);
341 return d->modeless;
342}
343
345{
346 Q_D(QQuickOverlay);
347 if (d->modeless == modeless)
348 return;
349
350 d->modeless = modeless;
352}
353
355{
356 if (!window)
357 return nullptr;
358
359 const char *name = "_q_QQuickOverlay";
361 if (!overlay) {
362 QQuickItem *content = window->contentItem();
363 // Do not re-create the overlay if the window is being destroyed
364 // and thus, its content item no longer has a window associated.
365 if (content && content->window()) {
368 }
369 }
370 return overlay;
371}
372
374{
375 return new QQuickOverlayAttached(object);
376}
377
379{
380 Q_D(QQuickOverlay);
382
383 if (change == ItemChildAddedChange || change == ItemChildRemovedChange) {
384 setVisible(!d->allDrawers.isEmpty() || !childItems().isEmpty());
385 if (data.item->parent() == d->mouseGrabberPopup)
386 d->setMouseGrabberPopup(nullptr);
387 }
388}
389
390void QQuickOverlay::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
391{
392 Q_D(QQuickOverlay);
393 QQuickItem::geometryChange(newGeometry, oldGeometry);
394 for (QQuickPopup *popup : std::as_const(d->allPopups))
396}
397
399{
400 Q_D(QQuickOverlay);
401 d->handleMouseEvent(this, event);
402}
403
405{
406 Q_D(QQuickOverlay);
407 d->handleMouseEvent(this, event);
408}
409
411{
412 Q_D(QQuickOverlay);
413 d->handleMouseEvent(this, event);
414}
415
416#if QT_CONFIG(quicktemplates2_multitouch)
418{
419 Q_D(QQuickOverlay);
420 d->handleTouchEvent(this, event);
421}
422#endif
423
424#if QT_CONFIG(wheelevent)
425void QQuickOverlay::wheelEvent(QWheelEvent *event)
426{
427 Q_D(QQuickOverlay);
428 if (d->mouseGrabberPopup) {
429 d->mouseGrabberPopup->overlayEvent(this, event);
430 return;
431 } else {
432 const auto popups = d->stackingOrderPopups();
433 for (QQuickPopup *popup : popups) {
434 if (popup->overlayEvent(this, event))
435 return;
436 }
437 }
438 event->ignore();
439}
440#endif
441
443{
444 Q_D(QQuickOverlay);
445 const auto popups = d->stackingOrderPopups();
446 for (QQuickPopup *popup : popups) {
448
449 // Stop filtering overlay events when reaching a popup item or an item
450 // that is inside the popup. Let the popup content handle its events.
451 if (item == p->popupItem || p->popupItem->isAncestorOf(item))
452 break;
453
454 // Let the popup try closing itself when pressing or releasing over its
455 // background dimming OR over another popup underneath, in case the popup
456 // does not have background dimming.
457 if (item == p->dimmer || !p->popupItem->isAncestorOf(item)) {
458 bool handled = false;
459 switch (event->type()) {
460#if QT_CONFIG(quicktemplates2_multitouch)
463 case QEvent::TouchEnd:
464 handled = d->handleTouchEvent(item, static_cast<QTouchEvent *>(event), popup);
465 break;
466#endif
470 handled = d->handleHoverEvent(item, static_cast<QHoverEvent *>(event), popup);
471 break;
472
476 handled = d->handleMouseEvent(item, static_cast<QMouseEvent *>(event), popup);
477 break;
478
479 default:
480 break;
481 }
482 if (handled)
483 return true;
484 }
485 }
486 return false;
487}
488
490{
491 Q_D(QQuickOverlay);
492 if (!isVisible() || object != d->window)
493 return false;
494
495 switch (event->type()) {
496#if QT_CONFIG(quicktemplates2_multitouch)
499 case QEvent::TouchEnd:
500 if (static_cast<QTouchEvent *>(event)->touchPointStates() & QEventPoint::Pressed)
501 emit pressed();
502 if (static_cast<QTouchEvent *>(event)->touchPointStates() & QEventPoint::Released)
503 emit released();
504
505 // allow non-modal popups to close on touch release outside
506 if (!d->mouseGrabberPopup) {
507 for (const QTouchEvent::TouchPoint &point : static_cast<QTouchEvent *>(event)->points()) {
508 if (point.state() == QEventPoint::Released) {
509 if (d->handleRelease(d->window->contentItem(), event, nullptr))
510 break;
511 }
512 }
513 }
514
515 // setup currentEventDeliveryAgent like in QQuickDeliveryAgent::event
517 d->deliveryAgentPrivate()->handleTouchEvent(static_cast<QTouchEvent *>(event));
519
520 // If a touch event hasn't been accepted after being delivered, there
521 // were no items interested in touch events at any of the touch points.
522 // Make sure to accept the touch event in order to receive the consequent
523 // touch events, to be able to close non-modal popups on release outside.
524 event->accept();
525 // Since we eat the event, QQuickWindow::event never sees it to clean up the
526 // grabber states. So we have to do so explicitly.
527 if (QQuickWindow *window = parentItem() ? parentItem()->window() : nullptr) {
529 d->clearGrabbers(static_cast<QPointerEvent *>(event));
530 }
531 return true;
532#endif
533
535#if QT_CONFIG(quicktemplates2_multitouch)
536 // do not emit pressed() twice when mouse events have been synthesized from touch events
537 if (static_cast<QMouseEvent *>(event)->source() == Qt::MouseEventNotSynthesized)
538#endif
539 emit pressed();
540
541 // setup currentEventDeliveryAgent like in QQuickDeliveryAgent::event
543 d->deliveryAgentPrivate()->handleMouseEvent(static_cast<QMouseEvent *>(event));
545
546 // If a mouse event hasn't been accepted after being delivered, there
547 // was no item interested in mouse events at the mouse point. Make sure
548 // to accept the mouse event in order to receive the consequent mouse
549 // events, to be able to close non-modal popups on release outside.
550 event->accept();
551 return true;
552
554#if QT_CONFIG(quicktemplates2_multitouch)
555 // do not emit released() twice when mouse events have been synthesized from touch events
556 if (static_cast<QMouseEvent *>(event)->source() == Qt::MouseEventNotSynthesized)
557#endif
558 emit released();
559
560 // allow non-modal popups to close on mouse release outside
561 if (!d->mouseGrabberPopup)
562 d->handleRelease(d->window->contentItem(), event, nullptr);
563 break;
564
565#if QT_CONFIG(wheelevent)
566 case QEvent::Wheel: {
567 // If the top item in the drawing-order is blocked by a modal popup, then
568 // eat the event. There is no scenario where the top most item is blocked
569 // by a popup, but an item further down in the drawing order is not.
570 QWheelEvent *we = static_cast<QWheelEvent *>(event);
571 const QVector<QQuickItem *> targetItems = d->deliveryAgentPrivate()->pointerTargets(
572 d->window->contentItem(), we, we->point(0), false, false);
573 if (targetItems.isEmpty())
574 break;
575
576 QQuickItem * const topItem = targetItems.first();
577 const auto popups = d->stackingOrderPopups();
578 // Eat the event if receiver topItem is not a child of a popup before
579 // the first modal popup.
580 for (const auto &popup : popups) {
581 const QQuickItem *popupItem = popup->popupItem();
582 if (!popupItem)
583 continue;
584 // if we reach a popup that contains the item, deliver the event
585 if (popupItem->isAncestorOf(topItem))
586 break;
587 // if the popup doesn't contain the item but is modal, eat the event
588 if (popup->overlayEvent(topItem, we))
589 return true;
590 }
591 break;
592 }
593#endif
594
595 default:
596 break;
597 }
598
599 return false;
600}
601
603{
604public:
605 Q_DECLARE_PUBLIC(QQuickOverlayAttached)
606
607 void setWindow(QQuickWindow *newWindow);
608
612};
613
615{
617 if (window == newWindow)
618 return;
619
620 if (QQuickOverlay *oldOverlay = QQuickOverlay::overlay(window)) {
623 }
624
625 if (QQuickOverlay *newOverlay = QQuickOverlay::overlay(newWindow)) {
628 }
629
630 window = newWindow;
631 emit q->overlayChanged();
632}
633
656{
659 d->setWindow(item->window());
661 } else if (QQuickPopup *popup = qobject_cast<QQuickPopup *>(parent)) {
662 d->setWindow(popup->window());
664 } else {
665 d->setWindow(qobject_cast<QQuickWindow *>(parent));
666 }
667}
668
679{
680 Q_D(const QQuickOverlayAttached);
681 return QQuickOverlay::overlay(d->window);
682}
683
701{
702 Q_D(const QQuickOverlayAttached);
703 return d->modal;
704}
705
707{
709 if (d->modal == modal)
710 return;
711
712 d->modal = modal;
714}
715
733{
734 Q_D(const QQuickOverlayAttached);
735 return d->modeless;
736}
737
739{
741 if (d->modeless == modeless)
742 return;
743
744 d->modeless = modeless;
746}
747
749
750#include "moc_qquickoverlay_p.cpp"
The QEventPoint class provides information about a point in a QPointerEvent.
Definition qeventpoint.h:20
\inmodule QtCore
Definition qcoreevent.h:45
@ MouseMove
Definition qcoreevent.h:63
@ MouseButtonPress
Definition qcoreevent.h:60
@ TouchUpdate
Definition qcoreevent.h:242
@ TouchBegin
Definition qcoreevent.h:241
@ HoverLeave
Definition qcoreevent.h:176
@ HoverEnter
Definition qcoreevent.h:175
@ HoverMove
Definition qcoreevent.h:177
@ MouseButtonRelease
Definition qcoreevent.h:61
QGraphicsWidget * window() const
bool isVisible() const
Returns true if the item is visible; otherwise, false is returned.
bool isAncestorOf(const QGraphicsItem *child) const
Returns true if this item is an ancestor of child (i.e., if this item is child's parent,...
\inmodule QtGui
Definition qevent.h:245
Definition qlist.h:74
bool isEmpty() const noexcept
Definition qlist.h:390
T & first()
Definition qlist.h:628
bool removeOne(const AT &t)
Definition qlist.h:581
iterator end()
Definition qlist.h:609
iterator begin()
Definition qlist.h:608
void reserve(qsizetype size)
Definition qlist.h:746
\inmodule QtGui
Definition qevent.h:195
static QMetaObject::Connection connect(const typename QtPrivate::FunctionPointer< Func1 >::Object *sender, Func1 signal, const typename QtPrivate::FunctionPointer< Func2 >::Object *receiverPrivate, Func2 slot, Qt::ConnectionType type=Qt::AutoConnection)
Definition qobject_p.h:298
\inmodule QtCore
Definition qobject.h:90
void installEventFilter(QObject *filterObj)
Installs an event filter filterObj on this object.
Definition qobject.cpp:2269
QObject * parent() const
Returns a pointer to the parent object.
Definition qobject.h:311
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2823
static bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *member)
\threadsafe
Definition qobject.cpp:3099
QVariant property(const char *name) const
Returns the value of the object's name property.
Definition qobject.cpp:4187
bool setProperty(const char *name, const QVariant &value)
Sets the value of the object's name property to value.
\inmodule QtCore\reentrant
Definition qpoint.h:214
A base class for pointer events.
Definition qevent.h:73
T * data() const
Definition qpointer.h:56
The QQmlComponent class encapsulates a QML component definition.
static QQuickDeliveryAgent * currentEventDeliveryAgent
static QQuickDrawerPrivate * get(QQuickDrawer *drawer)
QList< QQuickItem * > paintOrderChildItems() const
void removeItemChangeListener(QQuickItemChangeListener *, ChangeTypes types)
qreal rotation() const
void addItemChangeListener(QQuickItemChangeListener *listener, ChangeTypes types)
QQuickWindow * window
QQmlListProperty< QQuickItem > children()
static QQuickItemPrivate * get(QQuickItem *item)
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
Definition qquickitem.h:64
void setFiltersChildMouseEvents(bool filter)
Sets whether pointer events intended for this item's children should be filtered through this item.
QList< QQuickItem * > childItems() const
Returns the children of this item.
virtual void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
void setAcceptTouchEvents(bool accept)
If enabled is true, this sets the item to accept touch events; otherwise, touch events are not accept...
bool isVisible() const
void setAcceptedMouseButtons(Qt::MouseButtons buttons)
Sets the mouse buttons accepted by this item to buttons.
QQuickWindow * window() const
Returns the window in which this item is rendered.
QQuickItem * parentItem() const
void setVisible(bool)
virtual void itemChange(ItemChange, const ItemChangeData &)
Called when change occurs for this item.
QQuickItem * parent
\qmlproperty Item QtQuick::Item::parent This property holds the visual parent of the item.
Definition qquickitem.h:68
virtual void touchEvent(QTouchEvent *event)
This event handler can be reimplemented in a subclass to receive touch events for an item.
void setZ(qreal)
ItemChange
Used in conjunction with QQuickItem::itemChange() to notify the item about certain types of changes.
Definition qquickitem.h:143
@ ItemChildAddedChange
Definition qquickitem.h:144
@ ItemChildRemovedChange
Definition qquickitem.h:145
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,...
void setWindow(QQuickWindow *newWindow)
QQmlComponent * modeless
QQmlComponent * modal
QQuickOverlay * overlay
void setModal(QQmlComponent *modal)
void setModeless(QQmlComponent *modeless)
QQuickOverlayAttached(QObject *parent=nullptr)
\qmlattachedsignal QtQuick.Controls::Overlay::pressed()
QList< QQuickPopup * > stackingOrderPopups() const
A window overlay for popups.
QList< QQuickPopup * > stackingOrderDrawers() const
void setMouseGrabberPopup(QQuickPopup *popup)
QList< QQuickPopup * > allDrawers
bool startDrag(QEvent *event, const QPointF &pos)
QPointer< QQuickPopup > mouseGrabberPopup
QList< QQuickPopup * > allPopups
bool handleMouseEvent(QQuickItem *source, QMouseEvent *event, QQuickPopup *target=nullptr)
void itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &diff) override
void removePopup(QQuickPopup *popup)
bool handleRelease(QQuickItem *source, QEvent *event, QQuickPopup *target)
bool handlePress(QQuickItem *source, QEvent *event, QQuickPopup *target)
void addPopup(QQuickPopup *popup)
bool handleMove(QQuickItem *source, QEvent *event, QQuickPopup *target)
bool handleHoverEvent(QQuickItem *source, QHoverEvent *event, QQuickPopup *target=nullptr)
static QQuickOverlay * overlay(QQuickWindow *window)
void setModal(QQmlComponent *modal)
void mouseMoveEvent(QMouseEvent *event) override
This event handler can be reimplemented in a subclass to receive mouse move events for an item.
static QQuickOverlayAttached * qmlAttachedProperties(QObject *object)
void modalChanged()
void mouseReleaseEvent(QMouseEvent *event) override
This event handler can be reimplemented in a subclass to receive mouse release events for an item.
void setModeless(QQmlComponent *modeless)
QQmlComponent * modeless
void modelessChanged()
bool childMouseEventFilter(QQuickItem *item, QEvent *event) override
Reimplement this method to filter the pointer events that are received by this item's children.
void mousePressEvent(QMouseEvent *event) override
This event handler can be reimplemented in a subclass to receive mouse press events for an item.
bool eventFilter(QObject *object, QEvent *event) override
Filters events if this object has been installed as an event filter for the watched object.
QQuickOverlay(QQuickItem *parent=nullptr)
QQmlComponent * modal
void itemChange(ItemChange change, const ItemChangeData &data) override
Called when change occurs for this item.
void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override
virtual void resizeOverlay()
static QQuickPopupPrivate * get(QQuickPopup *popup)
void windowChanged(QQuickWindow *window)
static QQuickWindowPrivate * get(QQuickWindow *c)
\qmltype Window \instantiates QQuickWindow \inqmlmodule QtQuick
QQuickItem * contentItem
\qmlattachedproperty Item Window::contentItem
\inmodule QtCore\reentrant
Definition qrect.h:483
\inmodule QtCore
Definition qsize.h:207
The QTouchEvent class contains parameters that describe a touch event.
Definition qevent.h:916
T value() const &
Definition qvariant.h:511
static auto fromValue(T &&value) noexcept(std::is_nothrow_copy_constructible_v< T > &&Private::CanUseInternalSpace< T >) -> std::enable_if_t< std::conjunction_v< std::is_copy_constructible< T >, std::is_destructible< T > >, QVariant >
Definition qvariant.h:531
void contentOrientationChanged(Qt::ScreenOrientation orientation)
Qt::ScreenOrientation contentOrientation
the orientation of the window's contents
Definition qwindow.h:95
QSet< QString >::iterator it
Combined button and popup list for selecting options.
@ AllButtons
Definition qnamespace.h:89
@ MouseEventNotSynthesized
@ InvertedLandscapeOrientation
Definition qnamespace.h:275
@ InvertedPortraitOrientation
Definition qnamespace.h:274
@ LandscapeOrientation
Definition qnamespace.h:273
@ PortraitOrientation
Definition qnamespace.h:272
@ PrimaryOrientation
Definition qnamespace.h:271
#define Q_FALLTHROUGH()
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLuint GLuint end
GLenum target
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLuint name
GLsizei GLsizei GLchar * source
struct _cl_event * event
GLfixed GLfixed GLint GLint GLfixed points
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
GLfloat GLfloat p
[1]
QQuickItem * qobject_cast< QQuickItem * >(QObject *o)
Definition qquickitem.h:483
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define emit
double qreal
Definition qtypes.h:92
QGraphicsItem * item
aWidget window() -> setWindowTitle("New Window Title")
[2]
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent
\inmodule QtQuick
Definition qquickitem.h:158