简体   繁体   English

带有 ScrollView+TextArea 的自定义 QML 组件:TextArea 无法正确滚动

[英]Custom QML component with a ScrollView+TextArea: TextArea not scrollable correctly

I have a custom QML component I'd like to use for text editing.我有一个自定义 QML 组件,我想用于文本编辑。 When I add it to my main application, scrolling is very... "broken": the scrollbar doesn't reflect the right height of the content and shrinks in size when I scroll.当我将它添加到我的主应用程序时,滚动非常......“损坏”:滚动条没有反映内容的正确高度并且在我滚动时尺寸缩小。 When I get to the bottom of the sample text (10 paragraphs), it jumps back up to the top.当我到达示例文本的底部(10 个段落)时,它会跳回到顶部。 What could be wrong?可能有什么问题?

在此处输入图片说明

Reproducible test case Qt project .可重现的测试用例 Qt 项目 Both QML files replicated below:下面复制了两个 QML 文件:

Custom widget ( Instance.qml ):自定义小部件( Instance.qml ):

import QtQuick 2.12
import QtQuick.Controls 2.5

ScrollView {
    property string myText

    clip: true
    contentHeight: height
    ScrollBar.vertical.policy: ScrollBar.AlwaysOn

    TextArea {
        id: textArea
        text: myText
        selectByMouse: true
        wrapMode: "WrapAtWordBoundaryOrAnywhere"
        renderType: Text.NativeRendering

        background: Rectangle {
            border.width: 1
            border.color: "black"
        }
    }
}

main.qml : main.qml :

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Layouts 1.12
import QtQuick.Controls 2.5

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    ColumnLayout {
        id: errorsColumn
        anchors.fill: parent

        ScrollView {
            id: errorsScrollView
            Layout.fillHeight: true
            Layout.fillWidth: true
            clip: true

            contentWidth: parent.width
            contentHeight: errorsRepeaterColumn.height

            Column {
                id: errorsRepeaterColumn
                anchors.left: parent.left
                anchors.right: parent.right
                spacing: 5

                add: Transition {
                    NumberAnimation { properties: "x,y"; easing.type: Easing.OutBounce; duration: 500 }
                }

                Repeater {
                    model: 10
                    Button {
                        Layout.fillWidth: true
                        Layout.maximumHeight: 300
                        text: "I'm item " + index

                        onClicked: resultsPageEditor.state = "VISIBLE"
                    }
                }
            }
        }

        InstanceEditor {
            id: resultsPageEditor
            myText: "1 Numquam ducimus facilis quo eum perspiciatis sint alias soluta. Sit cupiditate dolorem perspiciatis quia fugit. Voluptas molestiae eius molestiae. Dolorum ipsam ipsum corporis provident nobis.

2 In assumenda suscipit incidunt et quas vero dicta. Ut et dolorem aut. Odio quo eveniet aut soluta harum molestias cumque vel. Nisi quis sed quaerat sapiente eos quaerat qui et. Numquam delectus ad delectus.

3 Enim rem et nihil nobis omnis voluptatem odit sed. Nemo rerum autem ipsa quia non quia. Praesentium molestiae iusto modi sint. Qui laboriosam eum quaerat aut cum perspiciatis. Qui iusto quisquam aut assumenda velit excepturi fugit rerum.

4 Veritatis est ut inventore sed eos. Dolorem perferendis mollitia illum vel dignissimos est. Iste explicabo quidem est.

5 Qui ad qui omnis molestias occaecati dolorum. Corrupti fuga voluptatibus voluptas laboriosam libero et sit. Omnis sed ut quia animi rerum voluptatem. Totam et impedit consequatur excepturi minus. Optio voluptatibus cumque neque sit blanditiis.

6 Autem quam laborum aut illum non nam eius debitis. Dolorem nostrum et molestiae eos. Dolorum architecto praesentium dignissimos corporis dignissimos.

7 Repudiandae autem autem animi. Praesentium exercitationem voluptate fugit voluptas cum voluptas. Perferendis eos aut modi corporis ratione et rerum.

8 Exercitationem amet itaque hic voluptas sunt hic eaque asperiores. Rerum corporis iure placeat possimus dolorem. Aut esse tempora odio quo provident laboriosam ut aut. Quam natus vero iusto qui quia qui ad. Quas quos vitae adipisci consequatur.

9 Perferendis inventore voluptas distinctio. Aspernatur sit magnam mollitia doloribus eum. Temporibus aut sunt nihil perferendis quisquam quidem tempora. Magni quia nihil sequi.

10 Est rerum et illum. Repellendus cumque aut voluptate qui omnis rem. Ut optio amet eius. Nemo ex et voluptatem adipisci dolorem molestiae. Maxime sint sint dolorem ut reiciendis sed dolor modi. Ipsa perferendis recusandae laboriosam."
            Layout.fillWidth: true
            height: 0

            states: [
                State {
                    name: "HIDDEN"
                    PropertyChanges { target: resultsPageEditor; height: 0 }
                },
                State {
                    name: "VISIBLE"
                    PropertyChanges { target: resultsPageEditor; height: 250 }
                }
            ]
            state: "HIDDEN"

            transitions: [
                Transition {
                    from: "*"; to: "VISIBLE"
                    NumberAnimation { properties: "height"; easing.type: Easing.InBack; duration: 500 }
                },
                Transition {
                    from: "*"; to: "HIDDEN"
                    NumberAnimation { properties: "height"; easing.type: Easing.InBack; duration: 500 }
                }
            ]
        }
    }
}

You should let the ScrollView manages the content size.您应该让ScrollView管理内容大小。 The second problem is that you put the Instance in a layout.第二个问题是您将Instance放在布局中。 You should use implicitHeight to handle the size of your item.您应该使用implicitHeight来处理您的项目的大小。

This should work as you want:这应该可以正常工作:

Instance {
            id: resultsPageEditor
            myText: "1 Numquam ducimus facilis quo eum perspiciatis sint alias soluta. Sit cupiditate dolorem perspiciatis quia fugit. Voluptas molestiae eius molestiae. Dolorum ipsam ipsum corporis provident nobis.

2 In assumenda suscipit incidunt et quas vero dicta. Ut et dolorem aut. Odio quo eveniet aut soluta harum molestias cumque vel. Nisi quis sed quaerat sapiente eos quaerat qui et. Numquam delectus ad delectus.

3 Enim rem et nihil nobis omnis voluptatem odit sed. Nemo rerum autem ipsa quia non quia. Praesentium molestiae iusto modi sint. Qui laboriosam eum quaerat aut cum perspiciatis. Qui iusto quisquam aut assumenda velit excepturi fugit rerum.

4 Veritatis est ut inventore sed eos. Dolorem perferendis mollitia illum vel dignissimos est. Iste explicabo quidem est.

5 Qui ad qui omnis molestias occaecati dolorum. Corrupti fuga voluptatibus voluptas laboriosam libero et sit. Omnis sed ut quia animi rerum voluptatem. Totam et impedit consequatur excepturi minus. Optio voluptatibus cumque neque sit blanditiis.

6 Autem quam laborum aut illum non nam eius debitis. Dolorem nostrum et molestiae eos. Dolorum architecto praesentium dignissimos corporis dignissimos.

7 Repudiandae autem autem animi. Praesentium exercitationem voluptate fugit voluptas cum voluptas. Perferendis eos aut modi corporis ratione et rerum.

8 Exercitationem amet itaque hic voluptas sunt hic eaque asperiores. Rerum corporis iure placeat possimus dolorem. Aut esse tempora odio quo provident laboriosam ut aut. Quam natus vero iusto qui quia qui ad. Quas quos vitae adipisci consequatur.

9 Perferendis inventore voluptas distinctio. Aspernatur sit magnam mollitia doloribus eum. Temporibus aut sunt nihil perferendis quisquam quidem tempora. Magni quia nihil sequi.

10 Est rerum et illum. Repellendus cumque aut voluptate qui omnis rem. Ut optio amet eius. Nemo ex et voluptatem adipisci dolorem molestiae. Maxime sint sint dolorem ut reiciendis sed dolor modi. Ipsa perferendis recusandae laboriosam."
            Layout.fillWidth: true
            Layout.alignment: Qt.AlignBottom

            states: [
                State {
                    name: "HIDDEN"
                    PropertyChanges { target: resultsPageEditor; implicitHeight: 0; }
                },
                State {
                    name: "VISIBLE"
                    PropertyChanges { target: resultsPageEditor; implicitHeight: 250; }
                }
            ]
            state: "HIDDEN"

            transitions: [
                Transition {
                    from: "*"; to: "VISIBLE"
                    NumberAnimation { properties: "implicitHeight"; easing.type: Easing.InBack; duration: 500 }
                },
                Transition {
                    from: "*"; to: "HIDDEN"
                    NumberAnimation { properties: "implicitHeight"; easing.type: Easing.InBack; duration: 500 }
                }
            ]
        }
ScrollView {
    property string myText

    clip: true
    ScrollBar.vertical.policy: ScrollBar.AlwaysOn

    onImplicitHeightChanged: textArea.update()

    TextArea {
        id: textArea
        text: myText
        selectByMouse: true
        wrapMode: "WrapAtWordBoundaryOrAnywhere"
        renderType: Text.NativeRendering

        background: Rectangle {
            anchors.fill: parent
            border.width: 1
            border.color: "black"
            color: "red"
        }
    }
}

In MacOS, I saw that the content of the TextArea is not displayed correctly when the ScrollView is resized.在 MacOS 中,我看到在调整ScrollView大小时, TextArea的内容无法正确显示。 That's why I put the line onImplicitHeightChanged: textArea.update() .这就是为什么我将行onImplicitHeightChanged: textArea.update() But, it's working fine without it on my Linux.但是,它在我的 Linux 上没有它就可以正常工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM