问题
ubuntu16.4下使用Qt5.8.0的中文输入法,会导致程序段错误。在我的程序中表现就是切换到中文输入法,即使不输入,仅是一个切换动作,当退出当前页面再次进入时,程序崩溃。
原因
问题原因并不确定,跟踪在selectionlistmodel.cpp的183行
QVariant SelectionListModel::data(const QModelIndex &index, int role) const
{
Q_D(const SelectionListModel);
return d->dataSource ? d->dataSource->selectionListData(d->type, index.row(), role) : QVariant();
}
时间仓促,不能很好确认最终原因是什么,根据现象判断可能是页面退出时,输入法没有很好的清理,再次进入时,读取前次数据出现错误
解决
当输入法变为不可见时,对输入法的候选字列表做清理。
对selectionlistmodel.cpp, selectionlistmodel.h做补丁。
diff -urN qtvirtualkeyboard-5.8/src/virtualkeyboard/selectionlistmodel.cpp qtvirtualkeyboard-5.8.ok/src/virtualkeyboard/selectionlistmodel.cpp
--- qtvirtualkeyboard-5.8/src/virtualkeyboard/selectionlistmodel.cpp 2017-04-06 21:09:19.000000000 +0800
+++ qtvirtualkeyboard-5.8.ok/src/virtualkeyboard/selectionlistmodel.cpp 2020-10-29 20:06:13.197664634 +0800
@@ -30,6 +30,7 @@
#include "selectionlistmodel.h"
#include "abstractinputmethod.h"
#include <QtCore/private/qabstractitemmodel_p.h>
+#include <QGuiApplication>
namespace QtVirtualKeyboard {
@@ -132,6 +133,14 @@
{
}
+void SelectionListModel::inputMethodVisibleChanged()
+{
+ Q_D(SelectionListModel);
+ beginResetModel();
+ d->rowCount = 0;
+ endResetModel();
+}
+
/*!
\internal
*/
@@ -141,6 +150,7 @@
if (d->dataSource) {
disconnect(this, SLOT(selectionListChanged(int)));
disconnect(this, SLOT(selectionListActiveItemChanged(int, int)));
+ disconnect(this, SLOT(inputMethodVisibleChanged()));
}
d->type = type;
if (d->dataSource) {
@@ -152,6 +162,8 @@
if (d->dataSource) {
connect(d->dataSource, SIGNAL(selectionListChanged(int)), SLOT(selectionListChanged(int)));
connect(d->dataSource, SIGNAL(selectionListActiveItemChanged(int, int)), SLOT(selectionListActiveItemChanged(int, int)));
+ connect(qGuiApp->inputMethod(), SIGNAL(visibleChanged()), SLOT(inputMethodVisibleChanged()));
+
}
}
diff -urN qtvirtualkeyboard-5.8/src/virtualkeyboard/selectionlistmodel.h qtvirtualkeyboard-5.8.ok/src/virtualkeyboard/selectionlistmodel.h
--- qtvirtualkeyboard-5.8/src/virtualkeyboard/selectionlistmodel.h 2017-04-06 21:09:19.000000000 +0800
+++ qtvirtualkeyboard-5.8.ok/src/virtualkeyboard/selectionlistmodel.h 2020-10-29 19:52:45.040456898 +0800
@@ -76,6 +76,9 @@
void selectionListChanged(int type);
void selectionListActiveItemChanged(int type, int index);
+ void inputMethodVisibleChanged();
+
+
private:
friend class InputEngine;
};