Я создал элемент Rectangle с элементом Text в центре, который действует как поле редактирования с элементом Cursor в конце текста.

SAMPLE iMAGE

Поэтому, чтобы QML позаботился об ориентации, я изменил элемент Text как

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 (арабский и английский).

0
Wagmare 18 Мар 2019 в 11:43

2 ответа

Лучший ответ

Я создал функцию для проверки выравнивания текста. поэтому при изменении арабского языка ориентация текста будет изменена автоматически.

function isArabicAlignment() {

        if(text_input.horizontalAlignment === Text.AlignRight)
            return true;
        else
            return false;
    }

Поэтому при изменении ввода текста я проверю состояние и обновлю положение курсора.

x: (textInputField !== "" && isArabicAlignment()) ?
              (text_input.x + text_input.contentWidth)) : //Changing Cursor in reverse.
0
Wagmare 26 Мар 2019 в 09:36

Арабский не всегда всегда . Числа, например, пишутся LtoR (как на английском языке). Также иностранные слова будут написаны LtoR. И наоборот, если вы добавите арабское слово в текст на английском языке, направление текста где-то изменится. Может быть середина линии, может быть на любом конце.

Вот почему простой прием, такой как вызов QFontMetrics.width (), будет работать только для простых случаев.

Попробуйте вместо этого QTextLayout. QLineEdit использует этот код в своем элементе управления для определения положения курсора по X:

qreal cursorToX(int cursor) const { return m_textLayout.lineAt(0).cursorToX(cursor); }
1
Aaron Digulla 18 Мар 2019 в 09:49