Avoid calling QCompleter::popup() internally

QCompleter::popup() is used to lazily create the popup itself.
However, we oftentimes call this function only to check if the
popup is visible.

Change-Id: I55531e1e6810c02a44f5f65124cf641b1a89de69
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@qt.io>
Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
bb10
Gabriel de Dietrich 2017-08-25 16:24:44 +07:00
parent c84b4ff495
commit d29f0bc65c
3 changed files with 18 additions and 11 deletions

View File

@ -101,6 +101,9 @@ public:
void _q_autoResizePopup();
void _q_fileSystemModelDirectoryLoaded(const QString &path);
void setCurrentIndex(QModelIndex, bool = true);
static QCompleterPrivate *get(QCompleter *o) { return o->d_func(); }
static const QCompleterPrivate *get(const QCompleter *o) { return o->d_func(); }
};
class QIndexMapper

View File

@ -71,6 +71,7 @@
#include <private/qabstractitemmodel_p.h>
#include <private/qabstractscrollarea_p.h>
#include <private/qlineedit_p.h>
#include <private/qcompleter_p.h>
#include <qdebug.h>
#if 0 /* Used to be included in Qt4 for Q_WS_MAC */ && QT_CONFIG(effetcts) && QT_CONFIG(style_mac)
#include <private/qcore_mac_p.h>
@ -3140,13 +3141,13 @@ void QComboBox::keyPressEvent(QKeyEvent *e)
Q_D(QComboBox);
#if QT_CONFIG(completer)
if (d->lineEdit
&& d->lineEdit->completer()
&& d->lineEdit->completer()->popup()
&& d->lineEdit->completer()->popup()->isVisible()) {
// provide same autocompletion support as line edit
d->lineEdit->event(e);
return;
if (const auto *cmpltr = completer()) {
const auto *popup = QCompleterPrivate::get(cmpltr)->popup;
if (popup && popup->isVisible()) {
// provide same autocompletion support as line edit
d->lineEdit->event(e);
return;
}
}
#endif

View File

@ -44,6 +44,7 @@
#endif
#include "qclipboard.h"
#include <private/qguiapplication_p.h>
#include <private/qcompleter_p.h>
#include <qpa/qplatformtheme.h>
#include <qstylehints.h>
#ifndef QT_NO_ACCESSIBILITY
@ -1484,7 +1485,8 @@ void QWidgetLineControl::complete(int key)
} else {
#ifndef QT_KEYPAD_NAVIGATION
if (text.isEmpty()) {
m_completer->popup()->hide();
if (auto *popup = QCompleterPrivate::get(m_completer)->popup)
popup->hide();
return;
}
#endif
@ -1630,10 +1632,10 @@ void QWidgetLineControl::processKeyEvent(QKeyEvent* event)
#if QT_CONFIG(completer)
if (m_completer) {
QCompleter::CompletionMode completionMode = m_completer->completionMode();
auto *popup = QCompleterPrivate::get(m_completer)->popup;
if ((completionMode == QCompleter::PopupCompletion
|| completionMode == QCompleter::UnfilteredPopupCompletion)
&& m_completer->popup()
&& m_completer->popup()->isVisible()) {
&& popup && popup->isVisible()) {
// The following keys are forwarded by the completer to the widget
// Ignoring the events lets the completer provide suitable default behavior
switch (event->key()) {
@ -1648,7 +1650,8 @@ void QWidgetLineControl::processKeyEvent(QKeyEvent* event)
if (!QApplication::keypadNavigationEnabled())
break;
#endif
m_completer->popup()->hide(); // just hide. will end up propagating to parent
popup->hide(); // just hide. will end up propagating to parent
break;
default:
break; // normal key processing
}