aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDominik Holland <dominik.holland@qt.io>2020-08-19 12:58:16 +0200
committerDominik Holland <dominik.holland@qt.io>2022-02-22 09:06:52 +0100
commit8c5e6bf3dc302b52d431b647417cf88fa9851310 (patch)
tree4fe1d82292fb76b167946cbdab5cd472ea5a8c30
parentd9dc2d743627f4a59d9d9afec5ce9ad59cfdd0b1 (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.cpp21
-rw-r--r--src/virtualkeyboard/qvirtualkeyboardselectionlistmodel.h1
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;