2016-03-31 2 views
3

Я работаю над текстовым редактором, написанным на C++ engine и Qt для пользовательского интерфейса. Я хочу разрешить пользователю писать с любым из источников ввода (клавиатура любого языка). Это было хорошо до тех пор, пока я не поддерживал языки с 1-1 клавиатурным отображением (например, французская/русская клавиатура). У меня был eventFilter установлен на моем Qwidget, на котором я рендеринга текста и захватывая ввод данных с клавиатуры в QEvent::InputMethodВоспитание InputWindow на OSX для ввода текста при вводе текста с помощью asian laguage

Но когда я начал с азиатских языков (например, японский/китайский) Я не в состоянии поддерживать все функции требуемый для редактирования текста на таком языке, типичным примером такого случая является разделение подчеркивания, когда пользователь записывает текст с японским (Hiragana IME) и нажимает клавишу пробела, которая помогает пользователю определить, какие все символы должны быть заменены содержимым на предсказании dialog.See Изображение ниже: some text written on TextEdit application with Japanese Input Method(Hiragana), notice the split underlines coming up when user hits a spacebar,:

после битвы некоторое время я понял, что Qt не предоставляет достаточно информации о расколах или длине строки, которая заменяется, и я отказываюсь от идеи создать весь этот внешний вид сам.

Но затем я обнаружил, что некоторые приложения используют некоторый метод ввода конкретной ОС для обработки такого сложного текста. Например, OSX Finder, если мы изменим метод ввода на японский (Hiragana) и начнем вводить текст, когда окно поиска находится в фокусе, оно всплывает в виде плавающего окна, которое принимает все мои входы и передает его поисковому устройству. Смотрите изображение ниже enter image description here

копаюсь больше, и я понял, что существует такая система, которая была доступна ранее в качестве менеджера Text Services с большим количеством документации («http://mirror.informatimago.com/next/developer.apple.com/technotes/te/te_27.html#Downloads»), которые могли бы сделать этот трюк очень легко для меня НО этот API устарел и больше не доступен.

То, что я ищу, является альтернативой этому устаревшему API. Означает ли какой-либо орган, есть ли у нас API-интерфейс какао, который может помочь мне принести этот компонент метода ввода операционной системы для легкого ввода текста.

Любая помощь/предложения приветствуются.

+0

Соответствующие классы «QInputMethod» и связанные с ними классы. –

ответ

3

Хорошо, я нашел решение. Я не знал, что Qt не предоставляет достаточной информации об этих расколах. Qt имеет способ обеспечить эту поддержку, используя позицию каретки. Так сделать вывод, информацию о тексте, который будет отображаться, можно легко извлечь с помощью:

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

Здесь старт положения курсора. Как только это положение станет ясным, легко определить, сколько длины текста должно быть подчеркнуто, чтобы дать пользователю четкую индикацию.