aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
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;