QT5.8的中文输入法导致程序段错误退出的问题解决

问题

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;
 };

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值