我正在使用C ++引擎和Qt for UI编写的文本编辑器。我想允许用户使用任何输入源(任何语言的键盘)编写。直到我支持具有1-1键盘映射(例如法语/俄语键盘)的语言时,一切都很好。我在我的eventFilter
上安装了Qwidget
,我正在渲染文本并在QEvent::InputMethod
捕获键盘输入
但是,当我开始使用亚洲语言(如日语/中文)时,我无法支持使用这种语言进行文本编辑所需的所有功能,这种情况的典型示例是当用户使用日语写一些文本时的分割下划线(平假名) IME)并按空格键,帮助用户确定所有字符将被预测对话框中的内容替换。参见下图::
经过一段时间的努力,我发现Qt没有提供关于正在被替换的字符串的分裂或长度的足够信息,我放弃了自己创建所有这些视觉外观的想法。
但后来我发现一些应用程序使用一些特定于操作系统的输入方法来处理这种复杂的文本。一个例子是OSX Finder,如果我们将输入法更改为日语(平假名)并在查找器窗口处于焦点时开始键入,它会弹出一个浮动窗口,该窗口接受我的所有输入并将其传递给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是光标的位置。一旦该位置清楚,就很容易确定应加下划线的文本长度,以便向用户提供清楚的指示。