diff options
author | Dominik Holland <dominik.holland@qt.io> | 2020-08-19 12:58:16 +0200 |
---|---|---|
committer | Dominik Holland <dominik.holland@qt.io> | 2022-02-22 09:06:52 +0100 |
commit | 8c5e6bf3dc302b52d431b647417cf88fa9851310 (patch) | |
tree | 4fe1d82292fb76b167946cbdab5cd472ea5a8c30 | |
parent | d9dc2d743627f4a59d9d9afec5ce9ad59cfdd0b1 (diff) |
Better handle input plugin switches in the KeyboardSelectionListModel
If the current dataSource gets destroyed, make sure to update the
rowCount accordingly, otherwise there might be a lot of QML warnings like
these:
.../style.qml:709:13: Unable to assign [undefined] to QString
In addition also do a boundary check in the data() function to make
sure the data requested from the plugin are really available.
Change-Id: I5ea57b945bc33a309c3b3b18ec029296d5428950
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
-rw-r--r-- | src/virtualkeyboard/qvirtualkeyboardselectionlistmodel.cpp | 21 | ||||
-rw-r--r-- | src/virtualkeyboard/qvirtualkeyboardselectionlistmodel.h | 1 |
2 files changed, 21 insertions, 1 deletions
diff --git a/src/virtualkeyboard/qvirtualkeyboardselectionlistmodel.cpp b/src/virtualkeyboard/qvirtualkeyboardselectionlistmodel.cpp index d2cbc22e..90b1e7df 100644 --- a/src/virtualkeyboard/qvirtualkeyboardselectionlistmodel.cpp +++ b/src/virtualkeyboard/qvirtualkeyboardselectionlistmodel.cpp @@ -170,6 +170,7 @@ void QVirtualKeyboardSelectionListModel::setDataSource(QVirtualKeyboardAbstractI if (d->dataSource) { disconnect(this, SLOT(selectionListChanged(Type))); disconnect(this, SLOT(selectionListActiveItemChanged(Type, int))); + disconnect(this, SLOT(dataSourceDestroyed())); } d->type = type; if (d->dataSource) { @@ -181,6 +182,7 @@ void QVirtualKeyboardSelectionListModel::setDataSource(QVirtualKeyboardAbstractI if (d->dataSource) { QObject::connect(d->dataSource.data(), &QVirtualKeyboardAbstractInputMethod::selectionListChanged, this, &QVirtualKeyboardSelectionListModel::selectionListChanged); QObject::connect(d->dataSource.data(), &QVirtualKeyboardAbstractInputMethod::selectionListActiveItemChanged, this, &QVirtualKeyboardSelectionListModel::selectionListActiveItemChanged); + QObject::connect(d->dataSource.data(), &QObject::destroyed, this, &QVirtualKeyboardSelectionListModel::dataSourceDestroyed); } } @@ -209,7 +211,14 @@ int QVirtualKeyboardSelectionListModel::rowCount(const QModelIndex &parent) cons QVariant QVirtualKeyboardSelectionListModel::data(const QModelIndex &index, int role) const { Q_D(const QVirtualKeyboardSelectionListModel); - return d->dataSource ? d->dataSource->selectionListData(d->type, index.row(), static_cast<Role>(role)) : QVariant(); + + if (!d->dataSource) + return QVariant(); + + if (index.row() < 0 || index.row() >= d->rowCount) + return QVariant(); + + return d->dataSource->selectionListData(d->type, index.row(), static_cast<Role>(role)); } /*! @@ -332,6 +341,16 @@ void QVirtualKeyboardSelectionListModel::selectionListActiveItemChanged(QVirtual } /*! + \internal +*/ +void QVirtualKeyboardSelectionListModel::dataSourceDestroyed() +{ + Q_D(QVirtualKeyboardSelectionListModel); + selectionListChanged(d->type); + selectionListActiveItemChanged(d->type, -1); +} + +/*! \qmlsignal void SelectionListModel::activeItemChanged(int index) This signal is emitted when the active item in the list changes. The diff --git a/src/virtualkeyboard/qvirtualkeyboardselectionlistmodel.h b/src/virtualkeyboard/qvirtualkeyboardselectionlistmodel.h index 40d07d7c..c19d9ed1 100644 --- a/src/virtualkeyboard/qvirtualkeyboardselectionlistmodel.h +++ b/src/virtualkeyboard/qvirtualkeyboardselectionlistmodel.h @@ -93,6 +93,7 @@ Q_SIGNALS: protected Q_SLOTS: void selectionListChanged(Type type); void selectionListActiveItemChanged(Type type, int index); + void dataSourceDestroyed(); private: friend class QVirtualKeyboardInputEngine; |