Как проверить автоматическое выравнивание текста, когда текст содержит арабские слова

#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.