QCompleter: add more nullptr checks for the widget

The widget might become nullptr, especially after delivering events to
it. So consistently test for nullptr before calling the event function.

Fixes: QTBUG-128478
Pick-to: 6.5
Change-Id: Ieed4e8b68b41488fafd9946d718c1d77fad39a44
Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
(cherry picked from commit 6b86d9d08b407a56bad2d37f65169e36356b0741)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Volker Hilsheimer 2024-10-31 18:03:00 +01:00 committed by Qt Cherry-pick Bot
parent 8c40e8cf12
commit 92005e34e8

View File

@ -1370,11 +1370,13 @@ bool QCompleter::eventFilter(QObject *o, QEvent *e)
return false;
}
// Send the event to the widget. If the widget accepted the event, do nothing
// If the widget did not accept the event, provide a default implementation
d->eatFocusOut = false;
(static_cast<QObject *>(d->widget))->event(ke);
d->eatFocusOut = true;
if (d->widget) {
// Send the event to the widget. If the widget accepted the event, do nothing
// If the widget did not accept the event, provide a default implementation
d->eatFocusOut = false;
(static_cast<QObject *>(d->widget))->event(ke);
d->eatFocusOut = true;
}
if (!d->widget || e->isAccepted() || !d->popup->isVisible()) {
// widget lost focus, hide the popup
if (d->widget && (!d->widget->hasFocus()
@ -1426,8 +1428,9 @@ bool QCompleter::eventFilter(QObject *o, QEvent *e)
#ifdef QT_KEYPAD_NAVIGATION
case QEvent::KeyRelease: {
QKeyEvent *ke = static_cast<QKeyEvent *>(e);
if (QApplicationPrivate::keypadNavigationEnabled() && ke->key() == Qt::Key_Back) {
if (d->widget &&
QApplicationPrivate::keypadNavigationEnabled() && ke->key() == Qt::Key_Back) {
QKeyEvent *ke = static_cast<QKeyEvent *>(e);
// Send the event to the 'widget'. This is what we did for KeyPress, so we need
// to do the same for KeyRelease, in case the widget's KeyPress event set
// up something (such as a timer) that is relying on also receiving the
@ -1444,7 +1447,8 @@ bool QCompleter::eventFilter(QObject *o, QEvent *e)
case QEvent::MouseButtonPress: {
#ifdef QT_KEYPAD_NAVIGATION
if (QApplicationPrivate::keypadNavigationEnabled()) {
if (d->widget
&& QApplicationPrivate::keypadNavigationEnabled()) {
// if we've clicked in the widget (or its descendant), let it handle the click
QWidget *source = qobject_cast<QWidget *>(o);
if (source) {
@ -1473,7 +1477,8 @@ bool QCompleter::eventFilter(QObject *o, QEvent *e)
return true;
case QEvent::InputMethod:
case QEvent::ShortcutOverride:
QCoreApplication::sendEvent(d->widget, e);
if (d->widget)
QCoreApplication::sendEvent(d->widget, e);
break;
default: