【问题标题】:QML ScrollView with ColumnLayoutQML ScrollView 与 ColumnLayout
【发布时间】:2015-08-19 19:47:45
【问题描述】:

我正在尝试围绕 ColumnLayout 创建滚动视图,不幸的是我当前的代码不起作用。我知道 ListView,但就我而言,我需要创建可滚动的 Layout,因为它会包含异构元素。

ApplicationWindow {
    id: mainwindow
    title: qsTr("Hello World")
    width: 300
    height: 300
    visible: true

    ScrollView {
        anchors.fill: parent

        ColumnLayout {
            width: mainwindow.width

            Image {
                anchors.bottomMargin: 10
                source: "img/button.jpg"
                width: parent.width
                height: 400
            }

            Image {
                source: "img/button.jpg"
                width: parent.width
                height: 500
            }
        }
    }
}

这会渲染成这个(这显然不是我想要的):

有两个问题:

  1. 图像不会拉伸到整个窗口宽度,parent.width 会被忽略。我希望图像的宽度与 ScrollView 完全相同(无水平滚动)
  2. 图像高度属性被忽略

我做错了什么?

【问题讨论】:

  • 布局的感觉是自动定位和调整元素大小。阅读更多here。您可以使用Layout.fillWidthLayout.fillHeight 将项目拉伸到宽度或高度。或者,可以设置Layout.preferred{Width,Height}。你也想念heightColumnLayout 的属性。
  • @folibis 获得了一些不错的分数。您也可以在图片上使用sourceSize 来强制调整大小(即sourceSize.width: parent.width)。问题是ScrollView 不应该这样使用。您可以使用自定义垂直滚动条装饰Flickable 或切换到Flickable(滚动条代码参见here)。

标签: c++ layout qml qt5


【解决方案1】:

我这边也有同样的问题。这对我有用:

ScrollView {
    width: parent.width
    height : parent.height
    contentWidth: column.width    // The important part
    contentHeight: column.height  // Same
    clip : true                   // Prevent drawing column outside the scrollview borders

    Column {
        id: column
        width: parent.width

        // Your items here
    }
}

【讨论】:

    【解决方案2】:

    我会使用一个普通的列并通过 id 直接访问所需的宽度属性。据我了解,这些容器元素根据其内容测量其大小,这可能是设置 ColumnLayouts 宽度无效的原因。

    这对我有用:

    ScrollView 
    {
        anchors.fill: parent
    
        Column {
    
            Repeater {
                model: 4;
                delegate: Item {
                    width: root.width;
                    height: image.sourceSize.height;
    
                    Image {
                        id: image;
                        anchors.centerIn: parent;
                        width: parent.width;
                        fillMode: Image.Stretch;
                        source: "img" + (index+1) + ".png"
                    }
                }
            }
        }
    }
    

    在我的例子中,root 只是父母的 id。希望这会有所帮助!

    【讨论】:

    • 好的,这工作,谢谢你的帮助。 CenterIn 和 Stretch 是多余的顺便说一句,没有它们也可以工作。哦... QML 感觉是我遇到过的最困难的布局引擎。我已经完成了 XAML、android XML 布局、iOS Xib 布局并且一切顺利,但在 QML 中,即使是最简单的事情也似乎非常困难。有没有好的分步 QML 教程或书籍? Qt.io 文档非常稀疏和分散,确实缺乏好的教程。
    • 刚才我坚持做世界上最简单的事情。我想在图像上绘制文本,但边距很小。这个怎么做?我试过Image {Text {anchors.margins:10}},但这些边距不起作用。
    • 一段时间后你会爱上 qml,你会看到 :) 看看qml book!关于居中文本:你设置了锚点吗?你也可能喜欢terrariumlivecv。他们都提供了一个实时的 qml 解释器,非常适合玩耍和了解事情是如何工作的。
    • Column 真正有用的少数其他情况之一。不错的答案!
    猜你喜欢
    • 2021-11-09
    • 2016-06-04
    • 1970-01-01
    • 2021-05-10
    • 2018-12-02
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多