6

アプリケーションからの出力として機能するqmlがあります(読み取り専用コンソールのようなものです)。ただし、情報を出力するときにスクロールして一番上に戻るため、使用するのが面倒です。

たとえば、TextArea1 秒ごとに 1 行を印刷するとします。1 分ほどすると、スクロール バーが表示されるのに十分な数の行が表示されます。一番下までスクロールすると、1 秒後にテキスト行が印刷され、一番上にスクロールして戻ります。

私が望む望ましい機能は、ユーザーが上にスクロールしてこれをオーバーライドしない限り、自動的に下にスクロールすることです (コンソールが出力するときのように)。それが理にかなっていることを願っています。ここにいくつかのコードがあります:

        ScrollArea {
            id: helpTextScrollArea
            anchors.left: parent.left
            anchors.right: parent.right
            anchors.top: myButton.bottom
            anchors.topMargin: 5
            anchors.bottom: parent.bottom
            visible: false
            horizontalScrollBar.visible: false

            onVisibleChanged: {
                helpText.visible = visible
            }

            HelpTextArea {
                id: helpText
                width: parent.parent.width - helpTextScrollArea.verticalScrollBar.width
                text: "Oops, no documentation."

                onVisibleChanged: {
                    if(helpTextScrollArea.visible != visible) {
                        helpTextScrollArea.visible = visible
                    }
                }
            }
        }

        Flickable
        {
            id: flick

            anchors.left: parent.left
            anchors.right: parent.right
            anchors.top: runStopButton.bottom
            anchors.bottom: parent.bottom
            anchors.topMargin: 5


            TextArea{

                id: messageArea
                anchors.fill: parent

                focus: true

                readOnly: true

                visible: !helpTextScrollArea.visible

                wrapMode: TextEdit.Wrap

                function addText(newText) {
                    text += newText + "\n"
                }
            }
        }

注: 私の Flickable は何もしないと思います。これは、問題を解決するための実験の一部でした。また、関数を使用addTextしてテキスト領域に印刷します。私はqmlについてほとんど何も知りません.このコードのほとんどは他の誰かによって書かれたものであり、私はそれを使用しようとしています. ありがとうございました!

4

3 に答える 3

3

contentYのプロパティをFlickable、適切な位置を計算する式にバインドできます。

Flickable {
    id: flick
    states: State {
        name: "autoscroll"
        PropertyChanges {
            target: flick
            contentY: messageArea.height - height
        }
    }
    onMovementEnded: {
        if (contentY === messageArea.height - height) {
            state = "autoscroll"
        }
        else {
            state = ""  // default state
        }
    }
    // ...
}
于 2012-06-15T03:17:46.510 に答える
2

Flickableには、visibleAreaと呼ばれる4つの読み取り専用プロパティがあります。*(QMLドキュメントでそれらの意味を読むことができます):

  • visibleArea.xPosition:xPosition = contentX / contentWidth
  • visibleArea.yPosition:yPosition = contentY / contentHeight
  • visibleArea.widthRatio:widthRatio = width / contentWidth
  • visibleArea.heightRatio:heightRatio=高さ/contentHeight
于 2012-07-02T02:05:20.430 に答える