Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make last item in QML container fill remaining space?

Tags:

c++

qt

qml

I want to have dynamically resizable window with a column layout such that whatever remaining space is filled by the last item in the column. I could do this by dynamically calculating the height of the last item in javascript. I could also move the last item out of the column and bind the top to the bottom of the column and the bottom of the container, however I would then have to also calculate the new size of the column from its contents.

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" }
    }
}

Is there a more elegant way of doing this?

like image 657
sjdowling Avatar asked Dec 05 '14 16:12

sjdowling


2 Answers

You no need count all child elements, you just need to use parent.height - y for Column, or parent.width - x for Row,

This also works when the ApplicationWindow is resized,

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
                }
            }
        }

}
like image 66
Haryanto Avatar answered Nov 04 '22 10:11

Haryanto


You can use ColumnLayout and Layout.fillHeight attached property instead of 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
        }
    }
}
like image 38
Meefte Avatar answered Nov 04 '22 08:11

Meefte