如何使 QML 容器中的最后一项填充剩余空间?

Posted

技术标签:

【中文标题】如何使 QML 容器中的最后一项填充剩余空间?【英文标题】:How to make last item in QML container fill remaining space? 【发布时间】:2014-12-05 16:05:10 【问题描述】:

我希望有一个具有列布局的动态可调整大小的窗口,以便该列中的最后一项填充任何剩余空间。我可以通过动态计算javascript中最后一项的高度来做到这一点。我还可以将最后一项移出列并将顶部绑定到列的底部和容器的底部,但是我还必须根据其内容计算列的新大小。

import QtQuick 2.0
import QtQuick.Controls 1.1

Rectangle 
    id: rect
    anchors.fill: parent
    Column 
        id: myColumn
        anchors.fill: parent
        Rectangle 
            id: container
            signal clicked
            width: label.width + 20; height: label.height + 6
            anchors  right: parent.right 
            border.width: 1
            MouseArea 
                id: mouseArea
                anchors.fill: parent
                onClicked:  
                    if (myColumn.state == 'hidden')  myColumn.state = '' 
                    else  myColumn.state = 'hidden'; 
                
            
            Text 
                id: label
                text:  if (myColumn.state == '') "Hide" else "Show" 
                anchors.centerIn: parent
            
        
        Text 
            id: textualBox
            text: "A Big Box"
            verticalAlignment: Text.AlignVCenter
            horizontalAlignment: Text.AlignHCenter
            anchors  left: parent.left; right: parent.right 
            height: 200
        

        TableView 
            id: table
            width: parent.width
            height:  myColumn.height - container.height - textualBox.height 
            model: myData
            TableViewColumn  role: "name"; title: "name"; width: 60 
            TableViewColumn  role: "stuff"; title: "stuff"; width: 60 
        

        states: State 
            name: 'hidden'
            PropertyChanges 
                target: textualBox
                height: 20
                text: "a little box"
            
        
        
    ListModel 
       id: myData
       ListElement name: "content" ; stuff: "4.5" 
       ListElement name: "content" ; stuff: "4.5" 
       ListElement name: "content" ; stuff: "4.5" 
    

有没有更优雅的方式来做到这一点?

【问题讨论】:

【参考方案1】:

您可以使用ColumnLayoutLayout.fillHeight 附加属性代替Column

import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Layouts 1.1

ApplicationWindow 
    visible: true
    width: 640
    height: 480

    ColumnLayout
        anchors.fill: parent
        Rectangle 
            color: "red"
            Layout.fillWidth: true
            height: 30
        
        Rectangle 
            color: "blue"
            Layout.fillWidth: true
            Layout.fillHeight: true
        
    

【讨论】:

【参考方案2】:

你不需要计算所有子元素,你只需要使用 parent.height - y 代表列,或 parent.width - x 代表行,

这也适用于调整应用程序窗口大小时,

import QtQuick 2.7
import QtQuick.Controls 2.0

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


        Column
            anchors.fill: parent

            Rectangle
                color:  "#ff0000"
                anchors.right: parent.right
                anchors.left: parent.left
                height: 100
            


            Rectangle
                color:  "#ffff00"
                anchors.right: parent.right
                anchors.left: parent.left
                height: 100
            
            Rectangle
                color:  "#ff00ff"
                anchors.right: parent.right
                anchors.left: parent.left
                height: parent.height - y

                Text 
                    text: qsTr("top line -----------------  ")
                    anchors.top: parent.top
                

                Text 
                    text: qsTr("bottom line -----------------  ")
                    anchors.bottom: parent.bottom
                
            
        


【讨论】:

以上是关于如何使 QML 容器中的最后一项填充剩余空间?的主要内容,如果未能解决你的问题,请参考以下文章

当它也是一个弹性容器时,如何防止最后一个弹性项目填充剩余宽度[重复]

如何使用 View 使布局填充剩余空间?

如何使 flexbox 元素填充剩余空间并滚动?

CSS flex:行选择器中的最后一项和第一项

如何使文本框扩展以填充网格单元的剩余空间?

img 设置 flex-grow 来填充 flex 容器的剩余空间,它会导致 flex 内部溢出 flex 容器 [重复]