3

我正在开发一个用 C++ 引擎和 Qt for UI 编写的文本编辑器。我想允许用户使用任何输入源(任何语言的键盘)进行书写。这一切都很好,直到我支持具有 1-1 键盘映射的语言(例如法语/俄语键盘)。我eventFilter安装了一个Qwidget我正在渲染文本并在其中捕获键盘输入的设备QEvent::InputMethod

但是当我开始使用亚洲语言(如日文/中文)时,我无法支持使用这种语言进行文本编辑所需的所有功能,这种情况的典型示例是用户使用日文(平假名)编写一些文本时的分割下划线IME )并按空格键,帮助用户确定所有字符将替换为预测对话框中的内容。见下图使用日文输入法(平假名)在 TextEdit 应用程序上编写的一些文本,请注意当用户按下空格键时出现拆分下划线,::

在挣扎了一段时间后,我发现 Qt 没有提供关于被替换的字符串的拆分或长度的足够信息,我放弃了自己创建所有这些视觉外观的想法。

但后来我发现有些应用程序使用一些特定于操作系统的输入法来处理这种复杂的文本。一个例子是 OSX Finder,如果我们将输入法更改为日语(平假名)并在 finder 窗口处于焦点时开始输入,它会弹出一个浮动窗口,接受我的所有输入并将其传递给 finder。见下图在此处输入图像描述

我挖掘得更多,我发现有这样一个框架,它早先作为文本服务管理器提供,有很多文档(“ http://mirror.informatimago.com/next/developer.apple.com/technotes/te/ te_27.html#Downloads " ) 这对我来说可以很容易地完成这个技巧但是这个 API 已经被弃用并且不再可用。

我现在正在寻找的是这个已弃用的 API 的替代方案。我们是否有一个可可 API 可以帮助我将这个操作系统输入法组件引入到简单的文本输入中?

4

1 回答 1

3

好的,我找到了解决方案。我无知地说 Qt 没有提供有关这些拆分的足够信息。Qt 可以通过使用插入符号位置来提供这种支持。总而言之,可以通过以下方式轻松检索要显示的文本的信息:

for( auto value : inEvent->attributes() )
    {
        if( value.type == QInputMethodEvent::Cursor )
        {
            std::cout<<" length "<< value.length;
            std::cout<<" start "<< value.start;
        }
    }

这里,start 是光标的位置。一旦这个位置明确了,就很容易确定应该加下划线的文本长度,以便给用户明确的指示。

于 2016-04-06T14:41:50.567 回答