8#include "private/qgraphicsproxywidget_p.h"
9#include "private/qwidget_p.h"
10#include "private/qapplication_p.h"
12#include <QtCore/qdebug.h>
13#include <QtGui/qevent.h>
14#include <QtWidgets/qgraphicsscene.h>
15#include <QtWidgets/qgraphicssceneevent.h>
16#include <QtWidgets/qlayout.h>
17#include <QtGui/qpainter.h>
18#include <QtWidgets/qstyleoption.h>
19#include <QtWidgets/qgraphicsview.h>
20#if QT_CONFIG(lineedit)
21#include <QtWidgets/qlineedit.h>
23#if QT_CONFIG(textedit)
24#include <QtWidgets/qtextedit.h>
166 posChangeMode(NoMode),
167 sizeChangeMode(NoMode),
168 visibleChangeMode(NoMode),
169 enabledChangeMode(NoMode),
170 styleChangeMode(NoMode),
171 paletteChangeMode(NoMode),
172 tooltipChangeMode(NoMode),
173 focusFromWidgetToProxy(
false),
174 proxyIsGivingFocus(
false)
192 q->setAcceptDrops(
true);
225 if (QWidgetPrivate::nearestGraphicsProxyWidget(receiver) !=
q)
230 switch (
event->type()) {
256 Q_ASSERT_X(
false,
"QGraphicsProxyWidget",
"internal error");
283 if (
q->rect().contains(
event->pos()) &&
q->acceptHoverEvents())
314 if ((
res &&
event->isAccepted()) || (
q->isWindow() && receiver ==
widget))
316 receiver = receiver->parentWidget();
328 if (widgetGuard &&
event.isAccepted())
357 if (
child->isEnabled()
359 && ((
child->focusPolicy() & focus_flag) == focus_flag)
360 && !(
child->d_func()->extra &&
child->d_func()->extra->focus_proxy)) {
376 extra->proxyWidget =
nullptr;
402 if (parentWidget && (proxyParent = qobject_cast<QGraphicsProxyWidget *>(
q->parentWidget()))) {
418 q->setGeometry(widgetGeometry);
448 const auto &
extra = subWin->d_func()->extra;
451 subProxy->d_func()->setWidget_helper(subWin,
false);
465 if (
child->isWidget()) {
467 if (
proxy->widget() == subWin) {
468 proxy->setWidget(
nullptr);
491 while (receiver && receiver !=
widget) {
516 d->widget->removeEventFilter(
this);
557 d->setWidget_helper(
widget,
true);
569 widget->d_func()->extra->proxyWidget =
nullptr;
574 const auto childItems =
q->childItems();
576 if (
child->d_ptr->isProxyWidget()) {
595 q->setAcceptHoverEvents(
false);
604 qWarning(
"QGraphicsProxyWidget::setWidget: cannot embed widget %p "
605 "which is not a toplevel widget, and is not a child of an embedded widget", newWidget);
614 newWidget->d_func()->createExtra();
615 extra = newWidget->d_func()->extra.get();
619 if (*proxyWidget !=
q) {
620 qWarning(
"QGraphicsProxyWidget::setWidget: cannot embed widget %p"
621 "; already embedded", newWidget);
632 q->setAcceptHoverEvents(
true);
729 bool proxyResizesWidget = !
d->posChangeMode && !
d->sizeChangeMode;
730 if (proxyResizesWidget) {
735 if (proxyResizesWidget) {
754 if (!
d->posChangeMode)
761 d->widget->move(
value.toPoint());
766 if (!
d->visibleChangeMode)
776 if (!
d->enabledChangeMode)
800 switch (
event->type()) {
807 if (!
d->styleChangeMode) {
809 d->widget->setStyle(
style());
816 int mask =
d->font.resolveMask() |
d->inheritedFontResolveMask;
824 int mask =
d->palette.resolveMask() |
d->inheritedPaletteResolveMask;
831 if (
event->isAccepted())
839 if (
event->isAccepted())
863#if QT_CONFIG(tooltip)
866 if (
d->lastWidgetUnderMouse) {
871 event->setAccepted(
e.isAccepted());
872 return e.isAccepted();
878 if (!
d->tooltipChangeMode) {
880 d->widget->setToolTip(toolTip());
891 if (
res & touchEvent->isAccepted())
909 if (
object ==
d->widget) {
910 switch (
event->type()) {
917 if (!
d->sizeChangeMode)
918 d->updateProxyGeometryFromWidget();
923 if (!
d->posChangeMode)
924 d->updateProxyGeometryFromWidget();
929 if (!
d->visibleChangeMode) {
937 if (!
d->enabledChangeMode) {
945 if (!
d->styleChangeMode) {
951#if QT_CONFIG(tooltip)
954 if (!
d->tooltipChangeMode) {
984#ifndef QT_NO_CONTEXTMENU
1000 pos =
d->mapToReceiver(
pos, receiver);
1009 globalPos =
event->screenPos();
1021#if QT_CONFIG(draganddrop)
1027#if !QT_CONFIG(draganddrop)
1034 QDragEnterEvent proxyDragEnter(
event->pos().toPoint(),
event->dropAction(),
event->mimeData(),
event->buttons(),
event->modifiers());
1035 proxyDragEnter.setAccepted(
event->isAccepted());
1037 event->setAccepted(proxyDragEnter.isAccepted());
1038 if (proxyDragEnter.isAccepted())
1039 event->setDropAction(proxyDragEnter.dropAction());
1048#if QT_CONFIG(draganddrop)
1050 if (!
d->widget || !
d->dragDropWidget)
1052 QDragLeaveEvent proxyDragLeave;
1054 d->dragDropWidget =
nullptr;
1063#if !QT_CONFIG(draganddrop)
1073 bool eventDelivered =
false;
1074 for (; receiver; receiver = receiver->parentWidget()) {
1075 if (!receiver->isEnabled() || !receiver->acceptDrops())
1078 QPoint receiverPos =
d->mapToReceiver(
p, receiver).toPoint();
1079 if (receiver !=
d->dragDropWidget) {
1081 QDragEnterEvent dragEnter(receiverPos,
event->possibleActions(),
event->mimeData(),
event->buttons(),
event->modifiers());
1082 dragEnter.setDropAction(
event->proposedAction());
1084 event->setAccepted(dragEnter.isAccepted());
1085 event->setDropAction(dragEnter.dropAction());
1086 if (!
event->isAccepted()) {
1091 d->lastDropAction =
event->dropAction();
1093 if (
d->dragDropWidget) {
1094 QDragLeaveEvent dragLeave;
1097 d->dragDropWidget = receiver;
1100 QDragMoveEvent dragMove(receiverPos,
event->possibleActions(),
event->mimeData(),
event->buttons(),
event->modifiers());
1101 event->setDropAction(
d->lastDropAction);
1103 event->setAccepted(dragMove.isAccepted());
1104 event->setDropAction(dragMove.dropAction());
1105 if (
event->isAccepted())
1106 d->lastDropAction =
event->dropAction();
1107 eventDelivered =
true;
1111 if (!eventDelivered) {
1112 if (
d->dragDropWidget) {
1114 QDragLeaveEvent dragLeave;
1116 d->dragDropWidget =
nullptr;
1129#if !QT_CONFIG(draganddrop)
1133 if (
d->widget &&
d->dragDropWidget) {
1134 QPoint widgetPos =
d->mapToReceiver(
event->pos(),
d->dragDropWidget).toPoint();
1137 event->setAccepted(
dropEvent.isAccepted());
1138 d->dragDropWidget =
nullptr;
1160 if (
d->lastWidgetUnderMouse) {
1162 d->lastWidgetUnderMouse =
nullptr;
1172#ifdef GRAPHICSPROXYWIDGET_DEBUG
1173 qDebug(
"QGraphicsProxyWidget::hoverMoveEvent");
1177 if (
d->lastWidgetUnderMouse) {
1179 d->lastWidgetUnderMouse =
nullptr;
1184 d->embeddedMouseGrabber =
nullptr;
1185 d->sendWidgetMouseEvent(
event);
1203 d->embeddedMouseGrabber =
nullptr;
1212#ifdef GRAPHICSPROXYWIDGET_DEBUG
1213 qDebug(
"QGraphicsProxyWidget::mouseMoveEvent");
1215 d->sendWidgetMouseEvent(
event);
1224#ifdef GRAPHICSPROXYWIDGET_DEBUG
1225 qDebug(
"QGraphicsProxyWidget::mousePressEvent");
1227 d->sendWidgetMouseEvent(
event);
1236#ifdef GRAPHICSPROXYWIDGET_DEBUG
1237 qDebug(
"QGraphicsProxyWidget::mouseDoubleClickEvent");
1239 d->sendWidgetMouseEvent(
event);
1245#if QT_CONFIG(wheelevent)
1249#ifdef GRAPHICSPROXYWIDGET_DEBUG
1250 qDebug(
"QGraphicsProxyWidget::wheelEvent");
1258 receiver =
d->widget;
1266 QApplicationPrivate::wheel_widget = receiver;
1274 pos =
d->mapToReceiver(
pos, receiver);
1296 QApplicationPrivate::wheel_widget = prev_grabber;
1315#ifdef GRAPHICSPROXYWIDGET_DEBUG
1316 qDebug(
"QGraphicsProxyWidget::mouseReleaseEvent");
1318 d->sendWidgetMouseEvent(
event);
1327#ifdef GRAPHICSPROXYWIDGET_DEBUG
1328 qDebug(
"QGraphicsProxyWidget::keyPressEvent");
1330 d->sendWidgetKeyEvent(
event);
1339#ifdef GRAPHICSPROXYWIDGET_DEBUG
1340 qDebug(
"QGraphicsProxyWidget::keyReleaseEvent");
1342 d->sendWidgetKeyEvent(
event);
1350#ifdef GRAPHICSPROXYWIDGET_DEBUG
1351 qDebug(
"QGraphicsProxyWidget::focusInEvent");
1355 if (
d->focusFromWidgetToProxy) {
1362 d->proxyIsGivingFocus =
true;
1364 switch (
event->reason()) {
1366 if (
QWidget *focusChild =
d->findFocusChild(
nullptr,
true))
1367 focusChild->setFocus(
event->reason());
1371 if (
QWidget *focusChild =
d->findFocusChild(
nullptr,
false))
1372 focusChild->setFocus(
event->reason());
1375 if (
d->widget &&
d->widget->focusWidget()) {
1376 d->widget->focusWidget()->setFocus(
event->reason());
1382 if (
d->widget &&
d->widget->focusWidget()
1386 d->proxyIsGivingFocus =
false;
1394#ifdef GRAPHICSPROXYWIDGET_DEBUG
1395 qDebug(
"QGraphicsProxyWidget::focusOutEvent");
1418 if (!
d->widget || !
d->scene)
1422 QWidget *lastFocusChild =
d->widget->focusWidget();
1423 if (
QWidget *newFocusChild =
d->findFocusChild(lastFocusChild,
next)) {
1424 newFocusChild->setFocus(reason);
1446 switch (
v.userType()) {
1447 case QMetaType::QRectF:
1448 v =
v.toRectF().translated(focusWidgetPos);
1450 case QMetaType::QPointF:
1451 v =
v.toPointF() + focusWidgetPos;
1453 case QMetaType::QRect:
1454 v =
v.toRect().translated(focusWidgetPos.
toPoint());
1456 case QMetaType::QPoint:
1489 if (
QLayout *l =
d->widget->layout())
1492 sh =
d->widget->sizeHint();
1495 if (
QLayout *l =
d->widget->layout())
1496 sh = l->minimumSize();
1498 sh =
d->widget->minimumSizeHint();
1501 if (
QLayout *l =
d->widget->layout())
1502 sh = l->maximumSize();
1523 d->widget->resize(
event->newSize().toSize());
1535 if (!
d->widget || !
d->widget->isVisible())
1539 const QRect exposedWidgetRect = (
option->exposedRect &
rect()).toAlignedRect();
1540 if (exposedWidgetRect.
isEmpty())
1547 d->widget->render(
painter, exposedWidgetRect.
topLeft(), exposedWidgetRect);
1585 if (!
child->parentWidget()) {
1586 qWarning(
"QGraphicsProxyWidget::createProxyForChildWidget: top-level widget not in a QGraphicsScene");
1597 proxy->setParent(parentProxy);
1629#include "moc_qgraphicsproxywidget.cpp"
static void dispatchEnterLeave(QWidget *enter, QWidget *leave, const QPointF &globalPosF)
static bool translateRawTouchEvent(QWidget *widget, const QTouchEvent *touchEvent)
static bool sendMouseEvent(QWidget *receiver, QMouseEvent *event, QWidget *alienWidget, QWidget *native, QWidget **buttonDown, QPointer< QWidget > &lastMouseReceiver, bool spontaneous=true, bool onlyDispatchEnterLeave=false)
static bool sendEvent(QObject *receiver, QEvent *event)
Sends event event directly to receiver receiver, using the notify() function.
Type
This enum type defines the valid event types in Qt.
@ GraphicsSceneMouseRelease
@ GraphicsSceneMousePress
@ GraphicsSceneMouseDoubleClick
The QFocusEvent class contains event parameters for widget focus events.
QVariant extra(Extra type) const
QList< QGraphicsItem * > children
The QGraphicsItem class is the base class for all graphical items in a QGraphicsScene.
virtual bool contains(const QPointF &point) const
Returns true if this item contains point, which is in local coordinates; otherwise,...
GraphicsItemChange
This enum describes the state changes that are notified by QGraphicsItem::itemChange().
virtual void wheelEvent(QGraphicsSceneWheelEvent *event)
This event handler, for event event, can be reimplemented to receive wheel events for this item.
void update(const QRectF &rect=QRectF())
Schedules a redraw of the area covered by rect in this item.
virtual void dragEnterEvent(QGraphicsSceneDragDropEvent *event)
This event handler, for event event, can be reimplemented to receive drag enter events for this item.
QGraphicsWidget * parentWidget() const
virtual void dropEvent(QGraphicsSceneDragDropEvent *event)
This event handler, for event event, can be reimplemented to receive drop events for this item.
@ ItemClipsChildrenToShape
virtual void dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
This event handler, for event event, can be reimplemented to receive drag leave events for this item.
bool isEnabled() const
Returns true if the item is enabled; otherwise, false is returned.
bool hasFocus() const
Returns true if this item is active, and it or its \l{focusProxy()}{focus proxy} has keyboard input f...
virtual void dragMoveEvent(QGraphicsSceneDragDropEvent *event)
This event handler, for event event, can be reimplemented to receive drag move events for this item.
void setEnabled(bool enabled)
If enabled is true, the item is enabled; otherwise, it is disabled.
virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const
This method is only relevant for input items.
void setVisible(bool visible)
If visible is true, the item is made visible.
bool isVisible() const
Returns true if the item is visible; otherwise, false is returned.
GraphicsItemFlags flags() const
Returns this item's flags.
QPointF mapFromScene(const QPointF &point) const
Maps the point point, which is in this item's scene's coordinate system, to this item's coordinate sy...
QPointF pos
the position of the item
The QGraphicsSceneDragDropEvent class provides events for drag and drop in the graphics view framewor...
void setTimestamp(quint64 ts)
The QGraphicsSceneHelpEvent class provides events when a tooltip is requested.
QPoint screenPos() const
Returns the position of the mouse cursor in screen coordinates at the moment the help event was sent.
QPointF scenePos() const
Returns the position of the mouse cursor in scene coordinates at the moment the help event was sent.
The QGraphicsSceneHoverEvent class provides hover events in the graphics view framework.
The QGraphicsSceneMouseEvent class provides mouse events in the graphics view framework.
void setButton(Qt::MouseButton button)
void setPos(const QPointF &pos)
void setButtons(Qt::MouseButtons buttons)
void setModifiers(Qt::KeyboardModifiers modifiers)
void setScreenPos(const QPoint &pos)
The QGraphicsSceneResizeEvent class provides events for widget resizing in the graphics view framewor...
The QGraphicsSceneWheelEvent class provides wheel events in the graphics view framework.
void removeItem(QGraphicsItem *item)
Removes the item item and all its children from the scene.
static QInputMethod * inputMethod()
returns the input method.
The QHelpEvent class provides an event that is used to request helpful information about a particular...
The QHideEvent class provides an event which is sent after a widget is hidden.
The QKeyEvent class describes a key event.
Qt::KeyboardModifiers modifiers() const
Returns the keyboard modifier flags that existed immediately after the event occurred.
int key() const
Returns the code of the key that was pressed or released.
The QLayout class is the base class of geometry managers.
void installEventFilter(QObject *filterObj)
Installs an event filter filterObj on this object.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
virtual bool eventFilter(QObject *watched, QEvent *event)
Filters events if this object has been installed as an event filter for the watched object.
static bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *member)
\threadsafe
void removeEventFilter(QObject *obj)
Removes an event filter object obj from this object.
void destroyed(QObject *=nullptr)
This signal is emitted immediately before the object obj is destroyed, after any instances of QPointe...
virtual int devType() const
The QPainter class performs low-level painting on widgets and other paint devices.
QPaintDevice * device() const
Returns the paint device on which this painter is currently painting, or \nullptr if the painter is n...
void setClipRect(const QRectF &, Qt::ClipOperation op=Qt::ReplaceClip)
Enables clipping, and sets the clip region to the given rectangle using the given clip operation.
\inmodule QtCore\reentrant
constexpr QPoint toPoint() const
Rounds the coordinates of this point to the nearest integer, and returns a QPoint object with the rou...
\inmodule QtCore\reentrant
constexpr void setY(int y) noexcept
Sets the y coordinate of this point to the given y coordinate.
constexpr void setX(int x) noexcept
Sets the x coordinate of this point to the given x coordinate.
void setTimestamp(quint64 timestamp) override
bool isNull() const
Returns true if the referenced object has been destroyed or if there is no referenced object; otherwi...
static const QPointingDevice * primaryPointingDevice(const QString &seatName=QString())
Returns the primary pointing device (the core pointer, traditionally assumed to be a mouse) on the gi...
\inmodule QtCore\reentrant
constexpr void moveTo(qreal x, qreal y) noexcept
Moves the rectangle, leaving the top-left corner at the given position (x, y).
constexpr void setSize(const QSizeF &s) noexcept
Sets the size of the rectangle to the given finite size.
constexpr QPointF topLeft() const noexcept
Returns the position of the rectangle's top-left corner.
\inmodule QtCore\reentrant
constexpr bool isEmpty() const noexcept
Returns true if the rectangle is empty, otherwise returns false.
constexpr QPoint topLeft() const noexcept
Returns the position of the rectangle's top-left corner.
The QShowEvent class provides an event that is sent when a widget is shown.
constexpr bool isNull() const noexcept
Returns true if both the width and height is 0; otherwise returns false.
constexpr bool isValid() const noexcept
Returns true if both the width and height is equal to or greater than 0; otherwise returns false.
The QStyleOptionGraphicsItem class is used to describe the parameters needed to draw a QGraphicsItem.
The QTouchEvent class contains parameters that describe a touch event.
Combined button and popup list for selecting options.
@ WA_WState_ExplicitShowHide
@ MouseEventSynthesizedByQt
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
bool qt_sendSpontaneousEvent(QObject *receiver, QEvent *event)
#define Q_RETURN_ARG(Type, data)
#define Q_ARG(Type, data)
GLsizei const GLfloat * v
[13]
GLint GLint GLint GLint GLint GLint GLint GLbitfield mask
GLdouble GLdouble GLdouble GLdouble q
decorationRoleName setToolTip
#define Q_ASSERT_X(cond, x, msg)
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent