diff options
Diffstat (limited to 'src/widgets/util/qcompleter.cpp')
-rw-r--r-- | src/widgets/util/qcompleter.cpp | 68 |
1 files changed, 42 insertions, 26 deletions
diff --git a/src/widgets/util/qcompleter.cpp b/src/widgets/util/qcompleter.cpp index 1b519bf4c5..f52321a3e1 100644 --- a/src/widgets/util/qcompleter.cpp +++ b/src/widgets/util/qcompleter.cpp @@ -840,8 +840,8 @@ void QCompleterPrivate::setCurrentIndex(QModelIndex index, bool select) void QCompleterPrivate::_q_completionSelected(const QItemSelection& selection) { QModelIndex index; - if (!selection.indexes().isEmpty()) - index = selection.indexes().first(); + if (const auto indexes = selection.indexes(); !indexes.isEmpty()) + index = indexes.first(); _q_complete(index, true); } @@ -1207,50 +1207,55 @@ Qt::MatchFlags QCompleter::filterMode() const */ void QCompleter::setPopup(QAbstractItemView *popup) { + Q_ASSERT(popup); Q_D(QCompleter); - Q_ASSERT(popup != nullptr); + if (popup == d->popup) + return; + + // Remember existing widget's focus policy, default to NoFocus + const Qt::FocusPolicy origPolicy = d->widget ? d->widget->focusPolicy() + : Qt::NoFocus; + + // If popup existed already, disconnect signals and delete object if (d->popup) { QObject::disconnect(d->popup->selectionModel(), nullptr, this, nullptr); QObject::disconnect(d->popup, nullptr, this, nullptr); - } - if (d->popup != popup) delete d->popup; - if (popup->model() != d->proxy) - popup->setModel(d->proxy); - popup->hide(); + } - Qt::FocusPolicy origPolicy = Qt::NoFocus; - if (d->widget) - origPolicy = d->widget->focusPolicy(); + // Assign new object, set model and hide + d->popup = popup; + if (d->popup->model() != d->proxy) + d->popup->setModel(d->proxy); + d->popup->hide(); // Mark the widget window as a popup, so that if the last non-popup window is closed by the // user, the application should not be prevented from exiting. It needs to be set explicitly via // setWindowFlag(), because passing the flag via setParent(parent, windowFlags) does not call // QWidgetPrivate::adjustQuitOnCloseAttribute(), and causes an application not to exit if the // popup ends up being the last window. - popup->setParent(nullptr); - popup->setWindowFlag(Qt::Popup); - popup->setFocusPolicy(Qt::NoFocus); + d->popup->setParent(nullptr); + d->popup->setWindowFlag(Qt::Popup); + d->popup->setFocusPolicy(Qt::NoFocus); if (d->widget) d->widget->setFocusPolicy(origPolicy); - popup->setFocusProxy(d->widget); - popup->installEventFilter(this); - popup->setItemDelegate(new QCompleterItemDelegate(popup)); + d->popup->setFocusProxy(d->widget); + d->popup->installEventFilter(this); + d->popup->setItemDelegate(new QCompleterItemDelegate(d->popup)); #if QT_CONFIG(listview) - if (QListView *listView = qobject_cast<QListView *>(popup)) { + if (QListView *listView = qobject_cast<QListView *>(d->popup)) { listView->setModelColumn(d->column); } #endif - QObject::connect(popup, SIGNAL(clicked(QModelIndex)), + QObject::connect(d->popup, SIGNAL(clicked(QModelIndex)), this, SLOT(_q_complete(QModelIndex))); QObject::connect(this, SIGNAL(activated(QModelIndex)), - popup, SLOT(hide())); + d->popup, SLOT(hide())); - QObject::connect(popup->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), + QObject::connect(d->popup->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(_q_completionSelected(QItemSelection))); - d->popup = popup; } /*! @@ -1291,10 +1296,21 @@ bool QCompleter::eventFilter(QObject *o, QEvent *e) { Q_D(QCompleter); - if (d->eatFocusOut && o == d->widget && e->type() == QEvent::FocusOut) { - d->hiddenBecauseNoMatch = false; - if (d->popup && d->popup->isVisible()) - return true; + if (o == d->widget) { + switch (e->type()) { + case QEvent::FocusOut: + if (d->eatFocusOut) { + d->hiddenBecauseNoMatch = false; + if (d->popup && d->popup->isVisible()) + return true; + } + break; + case QEvent::Hide: + if (d->popup) + d->popup->hide(); + default: + break; + } } if (o != d->popup) |