diff options
author | Liu Heng <[email protected]> | 2024-11-27 17:55:15 +0800 |
---|---|---|
committer | Liu Heng <[email protected]> | 2024-11-30 00:15:44 +0800 |
commit | 706d54eefee22e2feb16a7a7717c0a48ff270460 (patch) | |
tree | 7c1c89c49a5b08d07a8b2c0b006c1386779a7872 | |
parent | b3c0b08eb040bbd76b81a7c6172e3846e8ec0000 (diff) |
fix QApplciation with a QML popupWindow
Since 6.8, QML has popupWindow. When in popupModeMode,
it does not necessarily have a popupWidget.
Not checking whether popWidget is nullptr will cause the
program to crash.
Fixes: QTBUG-131664
Pick-to: 6.8
Change-Id: I624b62ef7185f0ab35215c2c34b0d6e9c80539a0
Reviewed-by: Tor Arne Vestbø <[email protected]>
-rw-r--r-- | src/widgets/kernel/qwidgetwindow.cpp | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp index 04c9e1cccb4..9b2d6ca31d4 100644 --- a/src/widgets/kernel/qwidgetwindow.cpp +++ b/src/widgets/kernel/qwidgetwindow.cpp @@ -505,8 +505,7 @@ void QWidgetWindow::handleNonClientAreaMouseEvent(QMouseEvent *e) void QWidgetWindow::handleMouseEvent(QMouseEvent *event) { - if (QApplicationPrivate::inPopupMode()) { - QPointer<QWidget> activePopupWidget = QApplication::activePopupWidget(); + if (auto *activePopupWidget = QApplication::activePopupWidget()) { QPointF mapped = event->position(); if (activePopupWidget != m_widget) mapped = activePopupWidget->mapFromGlobal(event->globalPosition()); @@ -682,7 +681,7 @@ void QWidgetWindow::handleTouchEvent(QTouchEvent *event) if (event->type() == QEvent::TouchCancel) { QApplicationPrivate::translateTouchCancel(event->pointingDevice(), event->timestamp()); event->accept(); - } else if (QApplicationPrivate::inPopupMode()) { + } else if (QApplication::activePopupWidget()) { // Ignore touch events for popups. This will cause QGuiApplication to synthesise mouse // events instead, which QWidgetWindow::handleMouseEvent will forward correctly: event->ignore(); @@ -697,8 +696,7 @@ void QWidgetWindow::handleKeyEvent(QKeyEvent *event) return; QObject *receiver = QWidget::keyboardGrabber(); - if (!receiver && QApplicationPrivate::inPopupMode()) { - QWidget *popup = QApplication::activePopupWidget(); + if (auto *popup = QApplication::activePopupWidget(); !receiver && popup) { QWidget *popupFocusWidget = popup->focusWidget(); receiver = popupFocusWidget ? popupFocusWidget : popup; } @@ -1151,8 +1149,7 @@ void QWidgetWindow::handleGestureEvent(QNativeGestureEvent *e) { // copy-pasted code to find correct widget follows: QObject *receiver = nullptr; - if (QApplicationPrivate::inPopupMode()) { - QWidget *popup = QApplication::activePopupWidget(); + if (auto *popup = QApplication::activePopupWidget()) { QWidget *popupFocusWidget = popup->focusWidget(); receiver = popupFocusWidget ? popupFocusWidget : popup; } |