具有缩放图像的GridLayout具有巨大的行间距

具有缩放图像的GridLayout具有巨大的行间距,layout,qml,Layout,Qml,我在qml中有一个简单的“对话框”,用户应该在其中选择一个图像。图像被缩小并显示在ScrollView内的GridLayout中。图像应该是scrollview的1/2宽度,旁边会有描述 我看到的是,垂直间距很大,并且不会随着窗口大小的改变而改变。实际上,间距似乎对应于全尺寸(未缩放)图像 当我设置Layout.preferredHeight:100(例如)时,问题会发生变化,但是如果图像的间距小于该值,并且高度不会超过100px,则间距也会随之改变。我想在不假设任何绝对尺寸的情况下解决这个问题

我在qml中有一个简单的“对话框”,用户应该在其中选择一个图像。图像被缩小并显示在ScrollView内的GridLayout中。图像应该是scrollview的1/2宽度,旁边会有描述

我看到的是,垂直间距很大,并且不会随着窗口大小的改变而改变。实际上,间距似乎对应于全尺寸(未缩放)图像

当我设置Layout.preferredHeight:100(例如)时,问题会发生变化,但是如果图像的间距小于该值,并且高度不会超过100px,则间距也会随之改变。我想在不假设任何绝对尺寸的情况下解决这个问题

如何解决这个问题

在您的示例中:

  • Image{source:“assets/”+src}
    将使用图像的实际大小

  • Layout.preferredWidth:.5*滚动.width
    将限制图像显示区域的宽度。因此,大图像将以300px(.5*scroll.width)的宽度显示,但将保留其高度

  • fillMode:Image.preserveApectFit将均匀缩放图像以适合300px。图像的比例现在在视觉上正常,但
    height
    属性的值保持不变,布局将使用该值

因此,我认为解决方案是通过
sourceSize
属性强制元素的宽度(高度将重新计算):

import QtQuick 2.9
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3

ApplicationWindow{
    id: root
    width: 600
    height: 1200
    visible: true

    ScrollView {
        id: scroll
        anchors.fill: parent

        ListModel{
            id: demosModel
            ListElement{  src:"01.jpg"; }
            ListElement{  src:"02.jpg"; }
            ListElement{  src:"03.jpg"; }
            ListElement{  src:"04.jpg"; }
        }

        GridLayout{
            anchors.fill: parent
            columns: 1
            rowSpacing: 10

            Repeater{
                model: demosModel

                Image {
                    source: "assets/" + src;
                    Layout.preferredWidth: .5 * scroll.width;

                    // Qt documentation: "If only one dimension of the size is set to greater
                    // than 0, the other dimension is set in proportion to preserve the
                    // source image's aspect ratio. (The fillMode is independent of this.)"
                    //      fillMode: Image.PreserveAspectFit;
                    sourceSize.width: Layout.preferredWidth
                }
            }
        }
    }
}
在您的示例中:

  • Image{source:“assets/”+src}
    将使用图像的实际大小

  • Layout.preferredWidth:.5*滚动.width
    将限制图像显示区域的宽度。因此,大图像将以300px(.5*scroll.width)的宽度显示,但将保留其高度

  • fillMode:Image.preserveApectFit将均匀缩放图像以适合300px。图像的比例现在在视觉上正常,但
    height
    属性的值保持不变,布局将使用该值

因此,我认为解决方案是通过
sourceSize
属性强制元素的宽度(高度将重新计算):

import QtQuick 2.9
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3

ApplicationWindow{
    id: root
    width: 600
    height: 1200
    visible: true

    ScrollView {
        id: scroll
        anchors.fill: parent

        ListModel{
            id: demosModel
            ListElement{  src:"01.jpg"; }
            ListElement{  src:"02.jpg"; }
            ListElement{  src:"03.jpg"; }
            ListElement{  src:"04.jpg"; }
        }

        GridLayout{
            anchors.fill: parent
            columns: 1
            rowSpacing: 10

            Repeater{
                model: demosModel

                Image {
                    source: "assets/" + src;
                    Layout.preferredWidth: .5 * scroll.width;

                    // Qt documentation: "If only one dimension of the size is set to greater
                    // than 0, the other dimension is set in proportion to preserve the
                    // source image's aspect ratio. (The fillMode is independent of this.)"
                    //      fillMode: Image.PreserveAspectFit;
                    sourceSize.width: Layout.preferredWidth
                }
            }
        }
    }
}

以这种方式定义映像{code>Image{source:src;sourceSize.width:.5*scroll.width;fillMode:Image.preserveApectFit;}
无法解决您的问题?它可以:)您如何知道这一点?我发现布局、大小调整等本质上是神秘的,我钦佩那些看到背后逻辑的人。请重新发布作为答案,以便我可以接受:)我经常遇到与项目大小和布局相关的错误。我终于开始理解如何解决这些问题,但我并不总是理解它们。当我找到时间来深化这件事时,我试着从Qt的源代码中看到,但这并不总是容易的…:)以这种方式定义映像{code>Image{source:src;sourceSize.width:.5*scroll.width;fillMode:Image.preserveApectFit;}
无法解决您的问题?它可以:)您如何知道这一点?我发现布局、大小调整等本质上是神秘的,我钦佩那些看到背后逻辑的人。请重新发布作为答案,以便我可以接受:)我经常遇到与项目大小和布局相关的错误。我终于开始理解如何解决这些问题,但我并不总是理解它们。当我找到时间来深化这件事时,我试着从Qt的源代码中看到,但这并不总是容易的…:)我感谢你的解释。谢谢我感谢你的解释。谢谢