使用亚洲语言输入文本时,在 OSX 上调出一个用于文本输入的 InputWindow

bringing up a InputWindow on OSX for text input while typing text with asian language

我正在为 UI 开发使用 C++ 引擎和 Qt 编写的文本编辑器。我想让用户使用任何输入源(任何语言的键盘)进行书写。一切都很好,直到我支持具有 1-1 键盘映射的语言(例如 French/Russian 键盘)。我在我的 Qwidget 上安装了一个 eventFilter,我在上面渲染文本并在 QEvent::InputMethod

中捕获键盘输入

但是当我开始使用亚洲语言(如 Japanese/Chinese )时,我无法支持使用这种语言进行文本编辑所需的所有功能,这种情况的典型示例是用户使用时的拆分下划线用日语(平假名 IME)写一些文本并按下 space 键,这有助于用户确定所有字符将被预测内容替换的内容 dialog.See 下图:

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

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

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

我现在正在寻找的是这个已弃用的 API 的替代品。 我们有 cocoa API 可以帮助我将此操作系统输入法组件用于简单的文本输入吗?

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

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

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