Автоматическая прокрутка TextArea в QML Sailfish / Silica

Обновление: возможное решение внизу.

Я изучаю разработку приложений для Sailfish с очень небольшим опытом работы с Qt/QML, но с некоторым опытом работы с другими инструментами (GTK, Tk, Motif, Xaw).

В настоящее время я пишу тупой клиент чата (без протокола, просто отправляю текст по сети). У меня есть страница разговора / чата, определенная в QML следующим образом:

import QtQuick 2.0
import Sailfish.Silica 1.0

Page {
    id: talkPage

    PageHeader {
        id: header

        title: qsTr("Talk")

        width: parent.width
        anchors.top: parent.top
    }

    TextField {
        id: message

        placeholderText: qsTr("Type your Message...")

        width: parent.width
        anchors.bottom: parent.bottom

        EnterKey.onClicked: {
            log.text += "\n> " + text;
            text = "";
        }
    }

    TextArea {
        id: log

        readOnly: true
        wrapMode: TextEdit.Wrap

        width: parent.width
        anchors.top: header.bottom
        anchors.bottom: message.top

        text: qsTr("Talk log")
    }
}

Теперь вы можете ввести текст в message TextField и нажмите Enter, чтобы добавить его в log TextArea.

Вопрос: Как сделать автоматическую прокрутку TextArea до конца при каждом добавлении в него сообщения.

Обратите внимание, что если я правильно понимаю, это использует Sailfish.Silica TextField, и это отличается от стандартного (QtQuick.Components?), Поэтому я не могу использовать log.append("\n> " + text); из QtQuick.Controls (недоступно на Sailfish.)

Решение в использовании C++, а не Javascript/QML вполне подходит, так как оно мне все равно понадобится для работы с сетью.

Спасибо заранее за любые предложения!

Бонусный вопрос: я пытался аранжировать header, message а также log в Column ранее, но не знал, как сделать header а также message сохранить их высоту по умолчанию, но сделать log разверните, чтобы заполнить экран. В GTK есть расширенное свойство для этого. Есть намеки?

Возможное решение: поместите TextArea внутри SilicaFlickable. По какой-то причине TextArea уже можно прокручивать без этого дополнительного шага, но этот способ можно использовать scrollToBottom() и заставить желаемое поведение. В качестве бонуса, таким образом, мы можем добавить красивую полосу прокрутки.

0 ответов

Другие вопросы по тегам