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);
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());
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(e->reason());
514 if (e->reason() == Qt::TabFocusReason || e->reason() == Qt::BacktabFocusReason)
515 m_widget->setAttribute(Qt::WA_KeyboardFocusChange);
521 QApplication::forwardEvent(m_widget, e);
530 QPointer<QWidgetWindow> self =
this;
532 if (
auto *activePopupWidget = QApplication::activePopupWidget()) {
533 QPointF mapped = event->position();
534 if (activePopupWidget != m_widget)
535 mapped = activePopupWidget->mapFromGlobal(event->globalPosition());
536 bool releaseAfter =
false;
537 QWidget *popupChild = activePopupWidget->childAt(mapped);
539 if (activePopupWidget != qt_popup_down) {
540 qt_button_down =
nullptr;
544 switch (event->type()) {
545 case QEvent::MouseButtonPress:
546 case QEvent::MouseButtonDblClick:
547 qt_button_down = popupChild;
551 case QEvent::MouseButtonRelease:
558 if (activePopupWidget->isEnabled()) {
560 QPointer<QWidget> receiver = activePopupWidget;
561 QPointF widgetPos = mapped;
563 receiver = qt_button_down;
565 receiver = popupChild;
566 if (receiver != activePopupWidget)
567 widgetPos = receiver->mapFromGlobal(event->globalPosition());
569 const bool reallyUnderMouse = activePopupWidget->rect().contains(mapped.toPoint());
570 const bool underMouse = activePopupWidget->underMouse();
571 if (underMouse != reallyUnderMouse) {
572 if (reallyUnderMouse) {
573 const QPointF receiverMapped = receiver->mapFromGlobal(event->globalPosition());
576 if (receiverMapped.x() >= 0 && receiverMapped.y() >= 0) {
577 QApplicationPrivate::dispatchEnterLeave(receiver,
nullptr, event->globalPosition());
581 QApplicationPrivate::dispatchEnterLeave(
nullptr, qt_last_mouse_receiver, event->globalPosition());
583 receiver = activePopupWidget;
587 if ((event->type() != QEvent::MouseButtonPress) || !(QMutableSinglePointEvent::isDoubleClick(event))) {
589 const auto buttons = event->type() == QEvent::MouseMove && qt_popup_down_closed
590 ? Qt::NoButton : event->buttons();
591 QMouseEvent e(event->type(), widgetPos, event->scenePosition(), event->globalPosition(),
592 event->button(), buttons, event->modifiers(),
593 event->source(), event->pointingDevice());
594 e.setTimestamp(event->timestamp());
595 QApplicationPrivate::sendMouseEvent(receiver, &e, receiver, receiver->window(), &qt_button_down, qt_last_mouse_receiver);
600 switch (event->type()) {
601 case QEvent::MouseButtonPress:
602 case QEvent::MouseButtonDblClick:
603 case QEvent::MouseButtonRelease:
604 activePopupWidget->close();
615 if (QApplication::activePopupWidget() != activePopupWidget
616 && QApplicationPrivate::replayMousePress
617 && QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::ReplayMousePressOutsidePopup).toBool()) {
618 if (m_widget->windowType() != Qt::Popup)
619 qt_button_down =
nullptr;
620 if (event->type() == QEvent::MouseButtonPress) {
622 QWidget *w = QApplication::widgetAt(event->globalPosition().toPoint());
623 if (w && !QApplicationPrivate::isBlockedByModal(w)) {
625 if (!w->isActiveWindow()) {
627 w->window()->raise();
630 if (
auto win = qt_widget_private(w)->windowHandle(QWidgetPrivate::WindowHandleMode::Closest)) {
631 const QRect globalGeometry = win->isTopLevel()
633 : QRect(win->mapToGlobal(QPoint(0, 0)), win->size());
634 if (globalGeometry.contains(event->globalPosition().toPoint())) {
636 const QPointF localPos = win->mapFromGlobal(event->globalPosition());
637 QMouseEvent *e =
new QMouseEvent(QEvent::MouseButtonPress, localPos, localPos, event->globalPosition(),
638 event->button(), event->buttons(), event->modifiers(), event->source());
639 QCoreApplicationPrivate::setEventSpontaneous(e,
true);
640 e->setTimestamp(event->timestamp());
641 QCoreApplication::postEvent(win, e);
646 QApplicationPrivate::replayMousePress =
false;
647#ifndef QT_NO_CONTEXTMENU
648 }
else if (event->type() == QGuiApplicationPrivate::contextMenuEventType()
649 && event->button() == Qt::RightButton) {
650 QWidget *receiver = activePopupWidget;
652 receiver = qt_button_down;
654 receiver = popupChild;
655 const QPoint localPos = receiver->mapFromGlobal(event->globalPosition()).toPoint();
656 QContextMenuEvent e(QContextMenuEvent::Mouse, localPos, event->globalPosition().toPoint(), event->modifiers());
657 QApplication::forwardEvent(receiver, &e, event);
664 qt_button_down =
nullptr;
673 if (QApplicationPrivate::instance()->modalState() && !qt_try_modal(m_widget, event->type()))
677 QWidget *widget = m_widget->childAt(event->position());
678 QPointF mapped = event->position();
683 const bool initialPress = event->buttons() == event->button();
684 if (event->type() == QEvent::MouseButtonPress && initialPress)
685 qt_button_down = widget;
687 QWidget *receiver = QApplicationPrivate::pickMouseReceiver(m_widget, event->scenePosition(), &mapped, event->type(), event->buttons(),
688 qt_button_down, widget);
692 if (d->isPopup() && receiver->window()->windowHandle() !=
this) {
694 mapped = event->position();
697 if ((event->type() != QEvent::MouseButtonPress) || !QMutableSinglePointEvent::isDoubleClick(event)) {
701 QMouseEvent translated(event->type(), mapped, event->scenePosition(), event->globalPosition(),
702 event->button(), event->buttons(), event->modifiers(),
703 event->source(), event->pointingDevice());
704 translated.setTimestamp(event->timestamp());
705 QApplicationPrivate::sendMouseEvent(receiver, &translated, widget, m_widget,
706 &qt_button_down, qt_last_mouse_receiver);
707 event->setAccepted(translated.isAccepted());
713#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
)
716 if (event->isAccepted() &&
718 (event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonRelease))
719 d->maybeSynthesizeContextMenuEvent(event);
724 if (event->type() == QEvent::TouchCancel) {
725 QApplicationPrivate::translateTouchCancel(event->pointingDevice(), event->timestamp());
727 }
else if (QApplication::activePopupWidget()) {
732 event->setAccepted(QApplicationPrivate::translateRawTouchEvent(m_widget, event));
738 if (QApplicationPrivate::instance()->modalState() && !qt_try_modal(m_widget, event->type()))
741 QObject *receiver = QWidget::keyboardGrabber();
742 if (
auto *popup = QApplication::activePopupWidget(); !receiver && popup) {
743 QWidget *popupFocusWidget = popup->focusWidget();
744 receiver = popupFocusWidget ? popupFocusWidget : popup;
747 receiver = focusObject();
748 QGuiApplication::forwardEvent(receiver, event);
753 bool changed =
false;
754 if (m_widget->testAttribute(Qt::WA_OutsideWSRange))
756 if (m_widget->testAttribute(Qt::WA_DontShowOnScreen))
759 if (m_widget->data->crect.size() != geometry().size()) {
761 m_widget->data->crect.setSize(geometry().size());
772 QTLWExtra *te = m_widget->d_func()->topData();
773 if (te->window ==
nullptr || te->window->handle() ==
nullptr)
775 const QMargins margins = frameMargins();
776 te->posIncludesFrame=
false;
777 te->frameStrut.setCoords(margins.left(), margins.top(), margins.right(), margins.bottom());
778 m_widget->data->fstrut_dirty =
false;
784 QCoreApplication::sendEvent(widget, &e);
785 QWidgetPrivate *d = QWidgetPrivate::get(widget);
786 for (
int i = 0; i < d->children.size(); ++i) {
787 QWidget *w = qobject_cast<QWidget *>(d->children.at(i));
789 sendChangeRecursively(w, type);
812
813
814
815
816
817
818
819
820
821
822
828 if (!m_widget->isVisible() || !m_widget->updatesEnabled() || !m_widget->rect().isValid())
831 QTLWExtra *tlwExtra = m_widget->window()->d_func()->maybeTopData();
832 if (tlwExtra && tlwExtra->backingStore) {
833 tlwExtra->repaintManager->markDirty(m_widget->rect(), m_widget,
834 QWidgetRepaintManager::UpdateLater, QWidgetRepaintManager::BufferInvalid);
841 QTLWExtra *tle = m_widget->d_func()->maybeTopData();
845 QRect normalGeometry;
846 if (
const QPlatformWindow *pw = handle())
847 normalGeometry = QHighDpi::fromNativePixels(pw->normalGeometry(),
this);
848 if (!normalGeometry.isValid() && !(m_widget->windowState() & ~Qt::WindowActive))
849 normalGeometry = m_widget->geometry();
850 if (normalGeometry.isValid())
851 tle->normalGeometry = normalGeometry;
856 if (m_widget->testAttribute(Qt::WA_OutsideWSRange))
858 if (m_widget->testAttribute(Qt::WA_DontShowOnScreen))
861 auto oldPosition = m_widget->data->crect.topLeft();
862 auto newPosition = geometry().topLeft();
864 if (!m_widget->isWindow()) {
865 if (
auto *nativeParent = m_widget->nativeParentWidget())
866 newPosition = m_widget->parentWidget()->mapFrom(nativeParent, newPosition);
869 bool changed = newPosition != oldPosition;
872 m_widget->data->crect.moveTopLeft(newPosition);
877 QMoveEvent widgetEvent(newPosition, oldPosition);
878 QGuiApplication::forwardEvent(m_widget, &widgetEvent, event);
884 auto oldRect = m_widget->rect();
887 QGuiApplication::forwardEvent(m_widget, event);
889 if (m_widget->d_func()->shouldPaintOnScreen()) {
890 QRegion dirtyRegion = m_widget->rect();
891 if (m_widget->testAttribute(Qt::WA_StaticContents))
892 dirtyRegion -= oldRect;
893 m_widget->d_func()->syncBackingStore(dirtyRegion);
895 m_widget->d_func()->syncBackingStore();
903 if (qt_popup_down == m_widget) {
907 bool accepted = m_widget->d_func()->handleClose(d->inClose ? QWidgetPrivate::CloseWithEvent
908 : QWidgetPrivate::CloseWithSpontaneousEvent);
909 event->setAccepted(accepted);
914 Q_Q(
const QWidgetWindow);
920 if (!q->widget()->testAttribute(Qt::WA_QuitOnClose))
923 return QWindowPrivate::participatesInLastWindowClosed();
928 Q_Q(
const QWidgetWindow);
935 return q->widget()->isVisible();
938#if QT_CONFIG(wheelevent)
940void QWidgetWindow::handleWheelEvent(QWheelEvent *event)
942 if (QApplicationPrivate::instance()->modalState() && !qt_try_modal(m_widget, event->type()))
945 QWidget *rootWidget = m_widget;
946 QPointF pos = event->position();
950 QWidget *activePopupWidget = QApplication::activePopupWidget();
951 if (activePopupWidget && activePopupWidget != m_widget) {
952 rootWidget = activePopupWidget;
953 pos = rootWidget->mapFromGlobal(event->globalPosition());
957 QWidget *widget = rootWidget->childAt(pos);
962 QPointF mapped = widget->mapFrom(rootWidget, pos);
964 QWheelEvent translated(mapped, event->globalPosition(), event->pixelDelta(), event->angleDelta(),
965 event->buttons(), event->modifiers(), event->phase(), event->inverted(),
966 event->source(), event->pointingDevice());
967 translated.setTimestamp(event->timestamp());
968 QGuiApplication::forwardEvent(widget, &translated, event);
973#if QT_CONFIG(draganddrop)
975static QWidget *findDnDTarget(QWidget *parent,
const QPointF &pos)
978 QWidget *widget = parent->childAt(pos);
981 for ( ; widget && !widget->isWindow() && !widget->acceptDrops(); widget = widget->parentWidget()) ;
982 if (widget && !widget->acceptDrops())
988
989
990
991
992
993
994
995
996
997void QWidgetWindow::handleDragEnterEvent(QDragMoveEvent *event, QWidget *widget)
999 Q_ASSERT(m_dragTarget ==
nullptr);
1001 widget = findDnDTarget(m_widget, event->position());
1006 m_dragTarget = widget;
1008 const QPointF mapped = widget->mapFromGlobal(m_widget->mapToGlobal(event->position()));
1009 QDragEnterEvent translated(mapped, event->possibleActions(), event->mimeData(),
1010 event->buttons(), event->modifiers());
1011 QGuiApplication::forwardEvent(m_dragTarget, &translated, event);
1012 event->setAccepted(translated.isAccepted());
1013 event->setDropAction(translated.dropAction());
1016void QWidgetWindow::handleDragMoveEvent(QDragMoveEvent *event)
1018 QPointer<QWidget> widget = findDnDTarget(m_widget, event->position());
1022 QDragLeaveEvent leaveEvent;
1023 QWidget *dragTarget = m_dragTarget;
1024 m_dragTarget =
nullptr;
1025 QGuiApplication::forwardEvent(dragTarget, &leaveEvent, event);
1028 const QPointF mapped = widget->mapFromGlobal(m_widget->mapToGlobal(event->position()));
1029 QDragMoveEvent translated(mapped, event->possibleActions(), event->mimeData(),
1030 event->buttons(), event->modifiers());
1032 if (widget == m_dragTarget) {
1033 translated.setDropAction(event->dropAction());
1034 translated.setAccepted(event->isAccepted());
1035 QGuiApplication::forwardEvent(m_dragTarget, &translated, event);
1038 QDragLeaveEvent leaveEvent;
1039 QWidget *dragTarget = m_dragTarget;
1040 m_dragTarget =
nullptr;
1041 QGuiApplication::forwardEvent(dragTarget, &leaveEvent, event);
1046 handleDragEnterEvent(event, widget);
1048 translated.setDropAction(event->dropAction());
1049 translated.setAccepted(event->isAccepted());
1053 QGuiApplication::forwardEvent(m_dragTarget, &translated, event);
1056 event->setAccepted(translated.isAccepted());
1057 event->setDropAction(translated.dropAction());
1061void QWidgetWindow::handleDragLeaveEvent(QDragLeaveEvent *event)
1064 QWidget *dragTarget = m_dragTarget;
1065 m_dragTarget =
nullptr;
1066 QGuiApplication::forwardEvent(dragTarget, event);
1070void QWidgetWindow::handleDropEvent(QDropEvent *event)
1072 if (Q_UNLIKELY(m_dragTarget.isNull())) {
1073 qWarning() << m_widget <<
": No drag target set.";
1077 const QPointF mapped = m_dragTarget->mapFromGlobal(m_widget->mapToGlobal(event->position()));
1078 QDropEvent translated(mapped, event->possibleActions(), event->mimeData(), event->buttons(), event->modifiers());
1079 QWidget *dragTarget = m_dragTarget;
1080 m_dragTarget =
nullptr;
1081 QGuiApplication::forwardEvent(dragTarget, &translated, event);
1082 event->setAccepted(translated.isAccepted());
1083 event->setDropAction(translated.dropAction());
1090 if (m_widget->testAttribute(Qt::WA_DontShowOnScreen))
1093 QWidgetPrivate *wPriv = m_widget->d_func();
1094 const bool exposed = isExposed();
1100 if (exposed && wPriv->data.in_destructor)
1103 if (wPriv->childrenHiddenByWState) {
1108 if (!wPriv->childrenShownByExpose) {
1110 wPriv->showChildren(
true);
1111 QShowEvent showEvent;
1112 QCoreApplication::forwardEvent(m_widget, &showEvent, event);
1113 wPriv->childrenShownByExpose =
true;
1117 if (wPriv->childrenShownByExpose) {
1122 wPriv->hideChildren(
true);
1123 QHideEvent hideEvent;
1124 QCoreApplication::forwardEvent(m_widget, &hideEvent, event);
1125 wPriv->childrenShownByExpose =
false;
1132 m_widget->setAttribute(Qt::WA_Mapped);
1133 for (QWidget *p = m_widget->parentWidget(); p && !p->testAttribute(Qt::WA_Mapped); p = p->parentWidget())
1134 p->setAttribute(Qt::WA_Mapped);
1135 if (!event->m_region.isNull())
1136 wPriv->syncBackingStore(event->m_region);
1138 m_widget->setAttribute(Qt::WA_Mapped,
false);
1145 Qt::WindowStates eventState = event->oldState();
1146 Qt::WindowStates widgetState = m_widget->windowState();
1147 Qt::WindowStates windowState = windowStates();
1148 if (widgetState & Qt::WindowActive)
1149 eventState |= Qt::WindowActive;
1153 if (windowState & Qt::WindowMinimized) {
1154 widgetState |= Qt::WindowMinimized;
1156 widgetState = windowState | (widgetState & Qt::WindowActive);
1158 updateNormalGeometry();
1163 if (widgetState != Qt::WindowStates::Int(m_widget->data->window_state)) {
1164 m_widget->data->window_state = uint(widgetState);
1165 QWindowStateChangeEvent widgetEvent(eventState);
1166 QGuiApplication::forwardEvent(m_widget, &widgetEvent, event);
1172 return m_widget->nativeEvent(eventType, message, result);
1175#if QT_CONFIG(tabletevent)
1176void QWidgetWindow::handleTabletEvent(QTabletEvent *event)
1178 static QPointer<QWidget> qt_tablet_target =
nullptr;
1180 QWidget *widget = qt_tablet_target;
1183 widget = m_widget->childAt(event->position());
1186 if (event->type() == QEvent::TabletPress)
1187 qt_tablet_target = widget;
1191 const QPointF mapped = widget->mapFromGlobal(event->globalPosition());
1192 QTabletEvent ev(event->type(), event->pointingDevice(), mapped, event->globalPosition(),
1193 event->pressure(), event->xTilt(), event->yTilt(), event->tangentialPressure(),
1194 event->rotation(), event->z(), event->modifiers(), event->button(), event->buttons());
1195 ev.setTimestamp(event->timestamp());
1196 ev.setAccepted(
false);
1197 QGuiApplication::forwardEvent(widget, &ev, event);
1198 event->setAccepted(ev.isAccepted());
1201 if (event->type() == QEvent::TabletRelease && event->buttons() == Qt::NoButton)
1202 qt_tablet_target =
nullptr;
1206#ifndef QT_NO_GESTURES
1210 QObject *receiver =
nullptr;
1211 if (
auto *popup = QApplication::activePopupWidget()) {
1212 QWidget *popupFocusWidget = popup->focusWidget();
1213 receiver = popupFocusWidget ? popupFocusWidget : popup;
1216 receiver = QApplication::widgetAt(e->globalPosition().toPoint());
1218 receiver = m_widget;
1220 QApplication::forwardEvent(receiver, e);
1224#ifndef QT_NO_CONTEXTMENU
1227 QWidget *receiver = qt_last_mouse_receiver.get();
1228 QPoint pos = e->pos();
1229 QPoint globalPos = e->globalPos();
1233 if (e->reason() == QContextMenuEvent::Keyboard) {
1234 receiver = QWidget::keyboardGrabber();
1236 if (QApplication::activePopupWidget()) {
1237 receiver = (QApplication::activePopupWidget()->focusWidget()
1238 ? QApplication::activePopupWidget()->focusWidget()
1239 : QApplication::activePopupWidget());
1240 }
else if (QApplication::focusWidget()) {
1241 receiver = QApplication::focusWidget();
1243 receiver = m_widget;
1246 if (Q_LIKELY(receiver)) {
1247 pos = receiver->inputMethodQuery(Qt::ImCursorRectangle).toRect().center();
1248 globalPos = receiver->mapToGlobal(pos);
1250 }
else if (Q_LIKELY(receiver)) {
1251 pos = receiver->mapFromGlobal(e->globalPos());
1255 QContextMenuEvent widgetEvent(e->reason(), pos, globalPos, e->modifiers());
1256 QGuiApplication::forwardEvent(receiver, &widgetEvent, e);
1263 QString name = m_widget->objectName();
1265 name = QString::fromUtf8(m_widget->metaObject()->className()) +
"Class"_L1;
1266 name +=
"Window"_L1;
1267 setObjectName(name);
1272#include "moc_qwidgetwindow_p.cpp"
Combined button and popup list for selecting options.
QPointer< QWidget > qt_last_mouse_receiver