aboutsummaryrefslogtreecommitdiffstats
path: root/src
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 /src
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>
Diffstat (limited to 'src')
-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;