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ø <tor.arne.vestbo@qt.io>
This commit is contained in:
parent
b3c0b08eb0
commit
706d54eefe
@ -505,8 +505,7 @@ void QWidgetWindow::handleNonClientAreaMouseEvent(QMouseEvent *e)
|
|||||||
|
|
||||||
void QWidgetWindow::handleMouseEvent(QMouseEvent *event)
|
void QWidgetWindow::handleMouseEvent(QMouseEvent *event)
|
||||||
{
|
{
|
||||||
if (QApplicationPrivate::inPopupMode()) {
|
if (auto *activePopupWidget = QApplication::activePopupWidget()) {
|
||||||
QPointer<QWidget> activePopupWidget = QApplication::activePopupWidget();
|
|
||||||
QPointF mapped = event->position();
|
QPointF mapped = event->position();
|
||||||
if (activePopupWidget != m_widget)
|
if (activePopupWidget != m_widget)
|
||||||
mapped = activePopupWidget->mapFromGlobal(event->globalPosition());
|
mapped = activePopupWidget->mapFromGlobal(event->globalPosition());
|
||||||
@ -682,7 +681,7 @@ void QWidgetWindow::handleTouchEvent(QTouchEvent *event)
|
|||||||
if (event->type() == QEvent::TouchCancel) {
|
if (event->type() == QEvent::TouchCancel) {
|
||||||
QApplicationPrivate::translateTouchCancel(event->pointingDevice(), event->timestamp());
|
QApplicationPrivate::translateTouchCancel(event->pointingDevice(), event->timestamp());
|
||||||
event->accept();
|
event->accept();
|
||||||
} else if (QApplicationPrivate::inPopupMode()) {
|
} else if (QApplication::activePopupWidget()) {
|
||||||
// Ignore touch events for popups. This will cause QGuiApplication to synthesise mouse
|
// Ignore touch events for popups. This will cause QGuiApplication to synthesise mouse
|
||||||
// events instead, which QWidgetWindow::handleMouseEvent will forward correctly:
|
// events instead, which QWidgetWindow::handleMouseEvent will forward correctly:
|
||||||
event->ignore();
|
event->ignore();
|
||||||
@ -697,8 +696,7 @@ void QWidgetWindow::handleKeyEvent(QKeyEvent *event)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
QObject *receiver = QWidget::keyboardGrabber();
|
QObject *receiver = QWidget::keyboardGrabber();
|
||||||
if (!receiver && QApplicationPrivate::inPopupMode()) {
|
if (auto *popup = QApplication::activePopupWidget(); !receiver && popup) {
|
||||||
QWidget *popup = QApplication::activePopupWidget();
|
|
||||||
QWidget *popupFocusWidget = popup->focusWidget();
|
QWidget *popupFocusWidget = popup->focusWidget();
|
||||||
receiver = popupFocusWidget ? popupFocusWidget : popup;
|
receiver = popupFocusWidget ? popupFocusWidget : popup;
|
||||||
}
|
}
|
||||||
@ -1151,8 +1149,7 @@ void QWidgetWindow::handleGestureEvent(QNativeGestureEvent *e)
|
|||||||
{
|
{
|
||||||
// copy-pasted code to find correct widget follows:
|
// copy-pasted code to find correct widget follows:
|
||||||
QObject *receiver = nullptr;
|
QObject *receiver = nullptr;
|
||||||
if (QApplicationPrivate::inPopupMode()) {
|
if (auto *popup = QApplication::activePopupWidget()) {
|
||||||
QWidget *popup = QApplication::activePopupWidget();
|
|
||||||
QWidget *popupFocusWidget = popup->focusWidget();
|
QWidget *popupFocusWidget = popup->focusWidget();
|
||||||
receiver = popupFocusWidget ? popupFocusWidget : popup;
|
receiver = popupFocusWidget ? popupFocusWidget : popup;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user