#qt #qml #arabic-support
#qt #qml #арабский-поддержка
Вопрос:
Я создал элемент Rectangle с текстовым элементом в центре, который действует как поле редактирования с элементом Cursor в конце текста.
Итак, чтобы QML позаботился об ориентации, я изменил текстовый элемент следующим образом
Text
{
id: text_input
font.bold: true
font.pixelSize: 22
color: "white"
text: view.defaultTextField
elide: Text.ElideLeft
verticalAlignment: Text.AlignVCenter
anchors.fill: parent
maximumLineCount: 1
clip: true
anchors{
rightMargin: 10
leftMargin: (textInputField === "") ? 18 : 12
verticalCenter: parent.verticalCenter
}
}
и изображение курсора как
Image
{
id: img_cursor
x: (textInputField !== "") ?
(text_input.x text_input.contentWidth)) : 12
anchors.verticalCenter: parent.verticalCenter
source: "text_cursor.png"
}
Теперь, если textInputField содержит арабский текст, TextItem автоматически изменяет ориентацию справа налево. и английский он меняется, чтобы начинаться слева.
Добавление текста происходит :
Арабский: слева <—справа
Русский: Слева —> Правильно
Что касается положения курсора, как я могу создать логику для автоматического определения и изменения положения x курсора на основе направления ориентации text_input (арабский и английский).
Комментарии:
1. Есть ли у вас какой-либо метод определения, является ли текст арабским или английским?
2. @eyllanesc: да, я пытался использовать регулярное выражение для определения арабского языка. Но проблема в том, что символы могут смешиваться. Если мы начнем с цифр и арабского, это все равно изменит ориентацию справа налево. Только если он начинается с английского символа и арабского, он остается в ориентации слева направо. таким образом, в некоторых сценариях обнаружение регулярных выражений не выполняется.
3. @Wagmare когда-нибудь задумывался об использовании компонента TextInput? doc.qt.io/qt-5/qml-qtquick-textinput.html#acceptableInput-prop
Ответ №1:
Арабский язык не всегда является RtoL. Цифры, например, пишутся LtoR (точно так же, как в английском). Кроме того, иностранные слова будут записываться LtoR. И наоборот, если вы добавите арабское слово в текст на английском языке, направление текста где-то изменится. Может быть в середине строки, может быть на любом конце.
Вот почему такой простой трюк, как вызов QFontMetrics.width(), будет работать только в простых случаях.
Попробуйте вместо этого QTextLayout. QLineEdit использует этот код в своем элементе управления, чтобы определить положение курсора X:
qreal cursorToX(int cursor) const { return m_textLayout.lineAt(0).cursorToX(cursor); }
Комментарии:
1. Есть ли какая-либо реализация, похожая на QML. основанная на моей реализации.
2. @Wagmare Я думаю, что это выходит за рамки того, что может сделать QML. Я бы написал небольшой виджет, а затем зарегистрировал его с помощью QML: doc.qt.io/qt-5/qtqml-tutorials-extending-qml-example.html
3. Я обновил приведенный ниже ответ об устранении проблемы с QML. но большое спасибо за пример и предложение.
4. @Wagmare Работает ли это при смешивании цифр и арабских слов?
5. Да, без сбоев. протестировано полностью
Ответ №2:
Я создал функцию для проверки выравнивания текста. таким образом, при изменении арабского языка ориентация текста будет изменена автоматически.
function isArabicAlignment() {
if(text_input.horizontalAlignment === Text.AlignRight)
return true;
else
return false;
}
Итак, при изменении ввода текста я проверю условие и обновлю положение курсора.
x: (textInputField !== "" amp;amp; isArabicAlignment()) ?
(text_input.x text_input.contentWidth)) : //Changing Cursor in reverse.