5#include "private/qwindow_p.h"
9#include "private/qwidget_p.h"
10#include "private/qapplication_p.h"
11#if QT_CONFIG(accessibility)
12#include <QtGui/qaccessible.h>
14#include <private/qwidgetrepaintmanager_p.h>
15#include <qpa/qwindowsysteminterface_p.h>
16#include <qpa/qplatformtheme.h>
17#include <qpa/qplatformwindow.h>
18#include <private/qgesturemanager_p.h>
19#include <private/qhighdpiscaling_p.h>
23using namespace Qt::StringLiterals;
27Q_WIDGETS_EXPORT
QWidget *qt_button_down =
nullptr;
33extern bool qt_try_modal(QWidget *widget, QEvent::Type type);
37 Q_DECLARE_PUBLIC(QWidgetWindow)
43 <<
"to" <<
visible <<
"via QWidgetWindowPrivate";
115 Q_Q(
const QWidgetWindow);
116 if (
const auto *widget = q->widget())
117 return widget->palette();
118 return QWindowPrivate::windowPalette();
124 Q_Q(
const QWidgetWindow);
125 const QWidget *widget = q->widget();
126 if (!widget || !widget->isWindow() || !widget->hasHeightForWidth())
128 const QSize oldSize = rect.size().toSize();
129 const QSize newSize = QLayout::closestAcceptableSize(widget, oldSize);
130 if (newSize == oldSize)
132 const int dw = newSize.width() - oldSize.width();
133 const int dh = newSize.height() - oldSize.height();
134 QRectF result = rect;
135 const QRectF currentGeometry(widget->geometry());
136 const qreal topOffset = result.top() - currentGeometry.top();
137 const qreal bottomOffset = result.bottom() - currentGeometry.bottom();
138 if (qAbs(topOffset) > qAbs(bottomOffset))
139 result.setTop(result.top() - dh);
141 result.setBottom(result.bottom() + dh);
142 const qreal leftOffset = result.left() - currentGeometry.left();
143 const qreal rightOffset = result.right() - currentGeometry.right();
144 if (qAbs(leftOffset) > qAbs(rightOffset))
145 result.setLeft(result.left() - dw);
147 result.setRight(result.right() + dw);
151bool q_evaluateRhiConfig(
const QWidget *w, QPlatformBackingStoreRhiConfig *outConfig, QSurface::SurfaceType *outType);
154 : QWindow(*
new QWidgetWindowPrivate(),
nullptr)
158 if (!QCoreApplication::testAttribute(Qt::AA_ForceRasterWidgets)) {
159 QSurface::SurfaceType type = QSurface::RasterSurface;
160 if (q_evaluateRhiConfig(m_widget,
nullptr, &type))
161 setSurfaceType(type);
164 connect(widget, &QObject::objectNameChanged,
this, &QWidgetWindow::updateObjectName);
165 connect(
this, &QWidgetWindow::screenChanged,
this, &
QWidgetWindow::handleScreenChange);
176 QTLWExtra *topData = QWidgetPrivate::get(m_widget)->topData();
181 topData->repaintManager.reset(
nullptr);
182 delete topData->backingStore;
183 topData->backingStore =
nullptr;
184 topData->widgetTextures.clear();
187 topData->window =
nullptr;
190#if QT_CONFIG(accessibility)
191QAccessibleInterface *QWidgetWindow::accessibleRoot()
const
194 return QAccessible::queryAccessibleInterface(m_widget);
201 QWidget *windowWidget = m_widget;
206 if (QWidgetPrivate::get(windowWidget)->data.in_destructor)
209 QWidget *widget = windowWidget->focusWidget();
212 widget = windowWidget;
214 QObject *focusObj = QWidgetPrivate::get(widget)->focusObject();
224 qCDebug(lcWidgetShowHide) <<
"Setting visibility of" <<
this
225 <<
"to" << visible <<
"via QWidgetWindow::setNativeWindowVisibility";
230 d->QWindowPrivate::setVisible(visible);
236 widget->focusNextPrevChild(next);
241 switch (event->type()) {
246 case QEvent::DynamicPropertyChange:
247 case QEvent::ChildAdded:
248 case QEvent::ChildRemoved:
260 return QWindow::event(event);
262 switch (event->type()) {
265 handleEnterLeaveEvent(event);
270 case QEvent::FocusIn:
271 handleFocusInEvent(
static_cast<QFocusEvent *>(event));
273 case QEvent::FocusOut: {
274#if QT_CONFIG(accessibility)
275 QAccessible::State state;
277 QAccessibleStateChangeEvent ev(m_widget, state);
278 QAccessible::updateAccessibility(&ev);
282 case QEvent::FocusAboutToChange:
283 if (QApplicationPrivate::focus_widget) {
284 if (QApplicationPrivate::focus_widget->testAttribute(Qt::WA_InputMethodEnabled))
285 QGuiApplication::inputMethod()->commit();
287 QGuiApplication::forwardEvent(QApplicationPrivate::focus_widget, event);
291 case QEvent::KeyPress:
292 case QEvent::KeyRelease:
293 case QEvent::ShortcutOverride:
294 handleKeyEvent(
static_cast<QKeyEvent *>(event));
297 case QEvent::MouseMove:
298 case QEvent::MouseButtonPress:
299 case QEvent::MouseButtonRelease:
300 case QEvent::MouseButtonDblClick:
301 handleMouseEvent(
static_cast<QMouseEvent *>(event));
304 case QEvent::NonClientAreaMouseMove:
305 case QEvent::NonClientAreaMouseButtonPress:
306 case QEvent::NonClientAreaMouseButtonRelease:
307 case QEvent::NonClientAreaMouseButtonDblClick:
308 handleNonClientAreaMouseEvent(
static_cast<QMouseEvent *>(event));
311 case QEvent::TouchBegin:
312 case QEvent::TouchUpdate:
313 case QEvent::TouchEnd:
314 case QEvent::TouchCancel:
315 handleTouchEvent(
static_cast<QTouchEvent *>(event));
323 handleResizeEvent(
static_cast<QResizeEvent *>(event));
326#if QT_CONFIG(wheelevent)
328 handleWheelEvent(
static_cast<QWheelEvent *>(event));
332#if QT_CONFIG(draganddrop)
333 case QEvent::DragEnter:
334 handleDragEnterEvent(
static_cast<QDragEnterEvent *>(event));
336 case QEvent::DragMove:
337 handleDragMoveEvent(
static_cast<QDragMoveEvent *>(event));
339 case QEvent::DragLeave:
340 handleDragLeaveEvent(
static_cast<QDragLeaveEvent *>(event));
343 handleDropEvent(
static_cast<QDropEvent *>(event));
348 handleExposeEvent(
static_cast<QExposeEvent *>(event));
351 case QEvent::WindowStateChange:
352 QWindow::event(event);
353 handleWindowStateChangedEvent(
static_cast<QWindowStateChangeEvent *>(event));
356 case QEvent::ThemeChange: {
357 QEvent widgetEvent(QEvent::ThemeChange);
358 QCoreApplication::forwardEvent(m_widget, &widgetEvent, event);
362#if QT_CONFIG(tabletevent)
363 case QEvent::TabletPress:
364 case QEvent::TabletMove:
365 case QEvent::TabletRelease:
366 handleTabletEvent(
static_cast<QTabletEvent *>(event));
370#ifndef QT_NO_GESTURES
371 case QEvent::NativeGesture:
372 handleGestureEvent(
static_cast<QNativeGestureEvent *>(event));
376#ifndef QT_NO_CONTEXTMENU
377 case QEvent::ContextMenu:
378 handleContextMenuEvent(
static_cast<QContextMenuEvent *>(event));
382 case QEvent::WindowBlocked:
383 qt_button_down =
nullptr;
386 case QEvent::UpdateRequest:
392 case QEvent::DevicePixelRatioChange:
393 handleDevicePixelRatioChange();
396 case QEvent::SafeAreaMarginsChange:
397 QWidgetPrivate::get(m_widget)->updateContentsRect();
404 if (shouldBePropagatedToWidget(event) && QCoreApplication::forwardEvent(m_widget, event))
407 return QWindow::event(event);
418 if (QApplicationPrivate::inPopupMode() && m_widget != QApplication::activePopupWidget() && !m_widget->underMouse())
421 if (event->type() == QEvent::Leave) {
422 QWidget *enter =
nullptr;
426 QWindowSystemInterfacePrivate::EnterEvent *systemEvent =
427 static_cast<QWindowSystemInterfacePrivate::EnterEvent *>
428 (QWindowSystemInterfacePrivate::peekWindowSystemEvent(QWindowSystemInterfacePrivate::Enter));
429 const QPointF globalPosF = systemEvent ? systemEvent->globalPos : QPointF(QGuiApplicationPrivate::lastCursorPosition);
433 QWindow *thisParent =
this;
434 QWindow *enterParent = enterWindow;
435 while (thisParent->parent())
436 thisParent = thisParent->parent();
437 while (enterParent->parent())
438 enterParent = enterParent->parent();
439 if (thisParent == enterParent) {
440 QGuiApplicationPrivate::currentMouseWindow = enterWindow;
441 enter = enterWindow->widget();
442 QWindowSystemInterfacePrivate::removeWindowSystemEvent(systemEvent);
449 if (!enter || !QWidget::mouseGrabber()) {
452 QWidget *leave = m_widget;
453 if (qt_last_mouse_receiver && !qt_last_mouse_receiver->internalWinId())
454 leave = qt_last_mouse_receiver.data();
455 QApplicationPrivate::dispatchEnterLeave(enter, leave, globalPosF);
456 qt_last_mouse_receiver = enter;
459 const QEnterEvent *ee =
static_cast<QEnterEvent *>(event);
460 QWidget *child = m_widget->childAt(ee->position());
461 QWidget *receiver = child ? child : m_widget.data();
462 QWidget *leave =
nullptr;
463 if (QApplicationPrivate::inPopupMode() && receiver == m_widget
464 && qt_last_mouse_receiver != m_widget) {
467 leave = qt_last_mouse_receiver;
469 QApplicationPrivate::dispatchEnterLeave(receiver, leave, ee->globalPosition());
470 qt_last_mouse_receiver = receiver;
476 QWidget *tlw = m_widget;
477 QWidget *w = tlw->nextInFocusChain();
481 uint focus_flag = qt_tab_all_widgets() ? Qt::TabFocus : Qt::StrongFocus;
485 if (((w->focusPolicy() & focus_flag) == focus_flag)
486 && w->isVisibleTo(m_widget) && w->isEnabled())
489 if (fw == FirstFocusWidget)
492 w = w->nextInFocusChain();
500 QWidget *focusWidget =
nullptr;
501 if (e->reason() == Qt::BacktabFocusReason)
502 focusWidget = getFocusWidget(LastFocusWidget);
503 else if (e->reason() == Qt::TabFocusReason)
504 focusWidget = getFocusWidget(FirstFocusWidget);
506 if (focusWidget !=
nullptr)
507 focusWidget->setFocus();
512 QApplication::forwardEvent(m_widget, e);
521 QPointer<QWidgetWindow> self =
this;
523 if (
auto *activePopupWidget = QApplication::activePopupWidget()) {
524 QPointF mapped = event->position();
525 if (activePopupWidget != m_widget)
526 mapped = activePopupWidget->mapFromGlobal(event->globalPosition());
527 bool releaseAfter =
false;
528 QWidget *popupChild = activePopupWidget->childAt(mapped);
530 if (activePopupWidget != qt_popup_down) {
531 qt_button_down =
nullptr;
535 switch (event->type()) {
536 case QEvent::MouseButtonPress:
537 case QEvent::MouseButtonDblClick:
538 qt_button_down = popupChild;
542 case QEvent::MouseButtonRelease:
549 if (activePopupWidget->isEnabled()) {
551 QPointer<QWidget> receiver = activePopupWidget;
552 QPointF widgetPos = mapped;
554 receiver = qt_button_down;
556 receiver = popupChild;
557 if (receiver != activePopupWidget)
558 widgetPos = receiver->mapFromGlobal(event->globalPosition());
560 const bool reallyUnderMouse = activePopupWidget->rect().contains(mapped.toPoint());
561 const bool underMouse = activePopupWidget->underMouse();
562 if (underMouse != reallyUnderMouse) {
563 if (reallyUnderMouse) {
564 const QPointF receiverMapped = receiver->mapFromGlobal(event->globalPosition());
567 if (receiverMapped.x() >= 0 && receiverMapped.y() >= 0) {
568 QApplicationPrivate::dispatchEnterLeave(receiver,
nullptr, event->globalPosition());
572 QApplicationPrivate::dispatchEnterLeave(
nullptr, qt_last_mouse_receiver, event->globalPosition());
574 receiver = activePopupWidget;
578 if ((event->type() != QEvent::MouseButtonPress) || !(QMutableSinglePointEvent::isDoubleClick(event))) {
580 const auto buttons = event->type() == QEvent::MouseMove && qt_popup_down_closed
581 ? Qt::NoButton : event->buttons();
582 QMouseEvent e(event->type(), widgetPos, event->scenePosition(), event->globalPosition(),
583 event->button(), buttons, event->modifiers(),
584 event->source(), event->pointingDevice());
585 e.setTimestamp(event->timestamp());
586 QApplicationPrivate::sendMouseEvent(receiver, &e, receiver, receiver->window(), &qt_button_down, qt_last_mouse_receiver);
591 switch (event->type()) {
592 case QEvent::MouseButtonPress:
593 case QEvent::MouseButtonDblClick:
594 case QEvent::MouseButtonRelease:
595 activePopupWidget->close();
606 if (QApplication::activePopupWidget() != activePopupWidget
607 && QApplicationPrivate::replayMousePress
608 && QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::ReplayMousePressOutsidePopup).toBool()) {
609 if (m_widget->windowType() != Qt::Popup)
610 qt_button_down =
nullptr;
611 if (event->type() == QEvent::MouseButtonPress) {
613 QWidget *w = QApplication::widgetAt(event->globalPosition().toPoint());
614 if (w && !QApplicationPrivate::isBlockedByModal(w)) {
616 if (!w->isActiveWindow()) {
618 w->window()->raise();
621 if (
auto win = qt_widget_private(w)->windowHandle(QWidgetPrivate::WindowHandleMode::Closest)) {
622 const QRect globalGeometry = win->isTopLevel()
624 : QRect(win->mapToGlobal(QPoint(0, 0)), win->size());
625 if (globalGeometry.contains(event->globalPosition().toPoint())) {
627 const QPointF localPos = win->mapFromGlobal(event->globalPosition());
628 QMouseEvent *e =
new QMouseEvent(QEvent::MouseButtonPress, localPos, localPos, event->globalPosition(),
629 event->button(), event->buttons(), event->modifiers(), event->source());
630 QCoreApplicationPrivate::setEventSpontaneous(e,
true);
631 e->setTimestamp(event->timestamp());
632 QCoreApplication::postEvent(win, e);
637 QApplicationPrivate::replayMousePress =
false;
638#ifndef QT_NO_CONTEXTMENU
639 }
else if (event->type() == QGuiApplicationPrivate::contextMenuEventType()
640 && event->button() == Qt::RightButton) {
641 QWidget *receiver = activePopupWidget;
643 receiver = qt_button_down;
645 receiver = popupChild;
646 const QPoint localPos = receiver->mapFromGlobal(event->globalPosition()).toPoint();
647 QContextMenuEvent e(QContextMenuEvent::Mouse, localPos, event->globalPosition().toPoint(), event->modifiers());
648 QApplication::forwardEvent(receiver, &e, event);
655 qt_button_down =
nullptr;
664 if (QApplicationPrivate::instance()->modalState() && !qt_try_modal(m_widget, event->type()))
668 QWidget *widget = m_widget->childAt(event->position());
669 QPointF mapped = event->position();
674 const bool initialPress = event->buttons() == event->button();
675 if (event->type() == QEvent::MouseButtonPress && initialPress)
676 qt_button_down = widget;
678 QWidget *receiver = QApplicationPrivate::pickMouseReceiver(m_widget, event->scenePosition(), &mapped, event->type(), event->buttons(),
679 qt_button_down, widget);
683 if (d->isPopup() && receiver->window()->windowHandle() !=
this) {
685 mapped = event->position();
688 if ((event->type() != QEvent::MouseButtonPress) || !QMutableSinglePointEvent::isDoubleClick(event)) {
692 QMouseEvent translated(event->type(), mapped, event->scenePosition(), event->globalPosition(),
693 event->button(), event->buttons(), event->modifiers(),
694 event->source(), event->pointingDevice());
695 translated.setTimestamp(event->timestamp());
696 QApplicationPrivate::sendMouseEvent(receiver, &translated, widget, m_widget,
697 &qt_button_down, qt_last_mouse_receiver);
698 event->setAccepted(translated.isAccepted());
704#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
)
707 if (event->isAccepted() &&
709 (event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonRelease))
710 d->maybeSynthesizeContextMenuEvent(event);
715 if (event->type() == QEvent::TouchCancel) {
716 QApplicationPrivate::translateTouchCancel(event->pointingDevice(), event->timestamp());
718 }
else if (QApplication::activePopupWidget()) {
723 event->setAccepted(QApplicationPrivate::translateRawTouchEvent(m_widget, event));
729 if (QApplicationPrivate::instance()->modalState() && !qt_try_modal(m_widget, event->type()))
732 QObject *receiver = QWidget::keyboardGrabber();
733 if (
auto *popup = QApplication::activePopupWidget(); !receiver && popup) {
734 QWidget *popupFocusWidget = popup->focusWidget();
735 receiver = popupFocusWidget ? popupFocusWidget : popup;
738 receiver = focusObject();
739 QGuiApplication::forwardEvent(receiver, event);
744 bool changed =
false;
745 if (m_widget->testAttribute(Qt::WA_OutsideWSRange))
747 if (m_widget->testAttribute(Qt::WA_DontShowOnScreen))
750 if (m_widget->data->crect.size() != geometry().size()) {
752 m_widget->data->crect.setSize(geometry().size());
763 QTLWExtra *te = m_widget->d_func()->topData();
764 if (te->window ==
nullptr || te->window->handle() ==
nullptr)
766 const QMargins margins = frameMargins();
767 te->posIncludesFrame=
false;
768 te->frameStrut.setCoords(margins.left(), margins.top(), margins.right(), margins.bottom());
769 m_widget->data->fstrut_dirty =
false;
775 QCoreApplication::sendEvent(widget, &e);
776 QWidgetPrivate *d = QWidgetPrivate::get(widget);
777 for (
int i = 0; i < d->children.size(); ++i) {
778 QWidget *w = qobject_cast<QWidget *>(d->children.at(i));
780 sendChangeRecursively(w, type);
803
804
805
806
807
808
809
810
811
812
813
819 if (!m_widget->isVisible() || !m_widget->updatesEnabled() || !m_widget->rect().isValid())
822 QTLWExtra *tlwExtra = m_widget->window()->d_func()->maybeTopData();
823 if (tlwExtra && tlwExtra->backingStore) {
824 tlwExtra->repaintManager->markDirty(m_widget->rect(), m_widget,
825 QWidgetRepaintManager::UpdateLater, QWidgetRepaintManager::BufferInvalid);
832 QTLWExtra *tle = m_widget->d_func()->maybeTopData();
836 QRect normalGeometry;
837 if (
const QPlatformWindow *pw = handle())
838 normalGeometry = QHighDpi::fromNativePixels(pw->normalGeometry(),
this);
839 if (!normalGeometry.isValid() && !(m_widget->windowState() & ~Qt::WindowActive))
840 normalGeometry = m_widget->geometry();
841 if (normalGeometry.isValid())
842 tle->normalGeometry = normalGeometry;
847 if (m_widget->testAttribute(Qt::WA_OutsideWSRange))
849 if (m_widget->testAttribute(Qt::WA_DontShowOnScreen))
852 auto oldPosition = m_widget->data->crect.topLeft();
853 auto newPosition = geometry().topLeft();
855 if (!m_widget->isWindow()) {
856 if (
auto *nativeParent = m_widget->nativeParentWidget())
857 newPosition = m_widget->parentWidget()->mapFrom(nativeParent, newPosition);
860 bool changed = newPosition != oldPosition;
863 m_widget->data->crect.moveTopLeft(newPosition);
868 QMoveEvent widgetEvent(newPosition, oldPosition);
869 QGuiApplication::forwardEvent(m_widget, &widgetEvent, event);
875 auto oldRect = m_widget->rect();
878 QGuiApplication::forwardEvent(m_widget, event);
880 if (m_widget->d_func()->shouldPaintOnScreen()) {
881 QRegion dirtyRegion = m_widget->rect();
882 if (m_widget->testAttribute(Qt::WA_StaticContents))
883 dirtyRegion -= oldRect;
884 m_widget->d_func()->syncBackingStore(dirtyRegion);
886 m_widget->d_func()->syncBackingStore();
894 if (qt_popup_down == m_widget) {
898 bool accepted = m_widget->d_func()->handleClose(d->inClose ? QWidgetPrivate::CloseWithEvent
899 : QWidgetPrivate::CloseWithSpontaneousEvent);
900 event->setAccepted(accepted);
905 Q_Q(
const QWidgetWindow);
911 if (!q->widget()->testAttribute(Qt::WA_QuitOnClose))
914 return QWindowPrivate::participatesInLastWindowClosed();
919 Q_Q(
const QWidgetWindow);
926 return q->widget()->isVisible();
929#if QT_CONFIG(wheelevent)
931void QWidgetWindow::handleWheelEvent(QWheelEvent *event)
933 if (QApplicationPrivate::instance()->modalState() && !qt_try_modal(m_widget, event->type()))
936 QWidget *rootWidget = m_widget;
937 QPointF pos = event->position();
941 QWidget *activePopupWidget = QApplication::activePopupWidget();
942 if (activePopupWidget && activePopupWidget != m_widget) {
943 rootWidget = activePopupWidget;
944 pos = rootWidget->mapFromGlobal(event->globalPosition());
948 QWidget *widget = rootWidget->childAt(pos);
953 QPointF mapped = widget->mapFrom(rootWidget, pos);
955 QWheelEvent translated(mapped, event->globalPosition(), event->pixelDelta(), event->angleDelta(),
956 event->buttons(), event->modifiers(), event->phase(), event->inverted(),
957 event->source(), event->pointingDevice());
958 translated.setTimestamp(event->timestamp());
959 QGuiApplication::forwardEvent(widget, &translated, event);
964#if QT_CONFIG(draganddrop)
966static QWidget *findDnDTarget(QWidget *parent,
const QPointF &pos)
969 QWidget *widget = parent->childAt(pos);
972 for ( ; widget && !widget->isWindow() && !widget->acceptDrops(); widget = widget->parentWidget()) ;
973 if (widget && !widget->acceptDrops())
979
980
981
982
983
984
985
986
987
988void QWidgetWindow::handleDragEnterEvent(QDragMoveEvent *event, QWidget *widget)
990 Q_ASSERT(m_dragTarget ==
nullptr);
992 widget = findDnDTarget(m_widget, event->position());
997 m_dragTarget = widget;
999 const QPointF mapped = widget->mapFromGlobal(m_widget->mapToGlobal(event->position()));
1000 QDragEnterEvent translated(mapped, event->possibleActions(), event->mimeData(),
1001 event->buttons(), event->modifiers());
1002 QGuiApplication::forwardEvent(m_dragTarget, &translated, event);
1003 event->setAccepted(translated.isAccepted());
1004 event->setDropAction(translated.dropAction());
1007void QWidgetWindow::handleDragMoveEvent(QDragMoveEvent *event)
1009 QPointer<QWidget> widget = findDnDTarget(m_widget, event->position());
1013 QDragLeaveEvent leaveEvent;
1014 QWidget *dragTarget = m_dragTarget;
1015 m_dragTarget =
nullptr;
1016 QGuiApplication::forwardEvent(dragTarget, &leaveEvent, event);
1019 const QPointF mapped = widget->mapFromGlobal(m_widget->mapToGlobal(event->position()));
1020 QDragMoveEvent translated(mapped, event->possibleActions(), event->mimeData(),
1021 event->buttons(), event->modifiers());
1023 if (widget == m_dragTarget) {
1024 translated.setDropAction(event->dropAction());
1025 translated.setAccepted(event->isAccepted());
1026 QGuiApplication::forwardEvent(m_dragTarget, &translated, event);
1029 QDragLeaveEvent leaveEvent;
1030 QWidget *dragTarget = m_dragTarget;
1031 m_dragTarget =
nullptr;
1032 QGuiApplication::forwardEvent(dragTarget, &leaveEvent, event);
1037 handleDragEnterEvent(event, widget);
1039 translated.setDropAction(event->dropAction());
1040 translated.setAccepted(event->isAccepted());
1044 QGuiApplication::forwardEvent(m_dragTarget, &translated, event);
1047 event->setAccepted(translated.isAccepted());
1048 event->setDropAction(translated.dropAction());
1052void QWidgetWindow::handleDragLeaveEvent(QDragLeaveEvent *event)
1055 QWidget *dragTarget = m_dragTarget;
1056 m_dragTarget =
nullptr;
1057 QGuiApplication::forwardEvent(dragTarget, event);
1061void QWidgetWindow::handleDropEvent(QDropEvent *event)
1063 if (Q_UNLIKELY(m_dragTarget.isNull())) {
1064 qWarning() << m_widget <<
": No drag target set.";
1068 const QPointF mapped = m_dragTarget->mapFromGlobal(m_widget->mapToGlobal(event->position()));
1069 QDropEvent translated(mapped, event->possibleActions(), event->mimeData(), event->buttons(), event->modifiers());
1070 QWidget *dragTarget = m_dragTarget;
1071 m_dragTarget =
nullptr;
1072 QGuiApplication::forwardEvent(dragTarget, &translated, event);
1073 event->setAccepted(translated.isAccepted());
1074 event->setDropAction(translated.dropAction());
1081 if (m_widget->testAttribute(Qt::WA_DontShowOnScreen))
1084 QWidgetPrivate *wPriv = m_widget->d_func();
1085 const bool exposed = isExposed();
1091 if (exposed && wPriv->data.in_destructor)
1094 if (wPriv->childrenHiddenByWState) {
1099 if (!wPriv->childrenShownByExpose) {
1101 wPriv->showChildren(
true);
1102 QShowEvent showEvent;
1103 QCoreApplication::forwardEvent(m_widget, &showEvent, event);
1104 wPriv->childrenShownByExpose =
true;
1108 if (wPriv->childrenShownByExpose) {
1113 wPriv->hideChildren(
true);
1114 QHideEvent hideEvent;
1115 QCoreApplication::forwardEvent(m_widget, &hideEvent, event);
1116 wPriv->childrenShownByExpose =
false;
1123 m_widget->setAttribute(Qt::WA_Mapped);
1124 for (QWidget *p = m_widget->parentWidget(); p && !p->testAttribute(Qt::WA_Mapped); p = p->parentWidget())
1125 p->setAttribute(Qt::WA_Mapped);
1126 if (!event->m_region.isNull())
1127 wPriv->syncBackingStore(event->m_region);
1129 m_widget->setAttribute(Qt::WA_Mapped,
false);
1136 Qt::WindowStates eventState = event->oldState();
1137 Qt::WindowStates widgetState = m_widget->windowState();
1138 Qt::WindowStates windowState = windowStates();
1139 if (widgetState & Qt::WindowActive)
1140 eventState |= Qt::WindowActive;
1144 if (windowState & Qt::WindowMinimized) {
1145 widgetState |= Qt::WindowMinimized;
1147 widgetState = windowState | (widgetState & Qt::WindowActive);
1149 updateNormalGeometry();
1154 if (widgetState != Qt::WindowStates::Int(m_widget->data->window_state)) {
1155 m_widget->data->window_state = uint(widgetState);
1156 QWindowStateChangeEvent widgetEvent(eventState);
1157 QGuiApplication::forwardEvent(m_widget, &widgetEvent, event);
1163 return m_widget->nativeEvent(eventType, message, result);
1166#if QT_CONFIG(tabletevent)
1167void QWidgetWindow::handleTabletEvent(QTabletEvent *event)
1169 static QPointer<QWidget> qt_tablet_target =
nullptr;
1171 QWidget *widget = qt_tablet_target;
1174 widget = m_widget->childAt(event->position());
1177 if (event->type() == QEvent::TabletPress)
1178 qt_tablet_target = widget;
1182 const QPointF mapped = widget->mapFromGlobal(event->globalPosition());
1183 QTabletEvent ev(event->type(), event->pointingDevice(), mapped, event->globalPosition(),
1184 event->pressure(), event->xTilt(), event->yTilt(), event->tangentialPressure(),
1185 event->rotation(), event->z(), event->modifiers(), event->button(), event->buttons());
1186 ev.setTimestamp(event->timestamp());
1187 ev.setAccepted(
false);
1188 QGuiApplication::forwardEvent(widget, &ev, event);
1189 event->setAccepted(ev.isAccepted());
1192 if (event->type() == QEvent::TabletRelease && event->buttons() == Qt::NoButton)
1193 qt_tablet_target =
nullptr;
1197#ifndef QT_NO_GESTURES
1201 QObject *receiver =
nullptr;
1202 if (
auto *popup = QApplication::activePopupWidget()) {
1203 QWidget *popupFocusWidget = popup->focusWidget();
1204 receiver = popupFocusWidget ? popupFocusWidget : popup;
1207 receiver = QApplication::widgetAt(e->globalPosition().toPoint());
1209 receiver = m_widget;
1211 QApplication::forwardEvent(receiver, e);
1215#ifndef QT_NO_CONTEXTMENU
1218 QWidget *receiver = qt_last_mouse_receiver.get();
1219 QPoint pos = e->pos();
1220 QPoint globalPos = e->globalPos();
1224 if (e->reason() == QContextMenuEvent::Keyboard) {
1225 receiver = QWidget::keyboardGrabber();
1227 if (QApplication::activePopupWidget()) {
1228 receiver = (QApplication::activePopupWidget()->focusWidget()
1229 ? QApplication::activePopupWidget()->focusWidget()
1230 : QApplication::activePopupWidget());
1231 }
else if (QApplication::focusWidget()) {
1232 receiver = QApplication::focusWidget();
1234 receiver = m_widget;
1237 if (Q_LIKELY(receiver)) {
1238 pos = receiver->inputMethodQuery(Qt::ImCursorRectangle).toRect().center();
1239 globalPos = receiver->mapToGlobal(pos);
1241 }
else if (Q_LIKELY(receiver)) {
1242 pos = receiver->mapFromGlobal(e->globalPos());
1245 if (receiver && receiver->isEnabled()) {
1246 QContextMenuEvent widgetEvent(e->reason(), pos, globalPos, e->modifiers());
1247 QGuiApplication::forwardEvent(receiver, &widgetEvent, e);
1254 QString name = m_widget->objectName();
1256 name = QString::fromUtf8(m_widget->metaObject()->className()) +
"Class"_L1;
1257 name +=
"Window"_L1;
1258 setObjectName(name);
1263#include "moc_qwidgetwindow_p.cpp"
Combined button and popup list for selecting options.
QPointer< QWindow > qt_last_mouse_receiver