在 QML 中制作 Hide/Flex 项目

Posted

技术标签:

【中文标题】在 QML 中制作 Hide/Flex 项目【英文标题】:Make Hide/Flex Items in QML 【发布时间】:2021-06-02 20:11:24 【问题描述】:

是否可以使用 QML 复制您可以在此人的 question 中看到的这种隐藏/弹性效果?我还使用 QT Creator 来帮助构建 UI,因此对于我在下面使用的基线示例,我有一个按钮,当按下该按钮时,将显示一个白色矩形,该矩形将在未来包含更多内容.而当这个白色长方形出现时,白色长方形里面的灰色长方形也相应变长,基本包裹住了它。在此过程中,Some 文本也像 after.png 中一样被按下,当再次按下按钮时,白色矩形应该消失并且 Some 文本应该向上移动。

除了使用 hide 来编写部分功能之外,我不知道如何让对象像那样移动。这是after.png对应的代码

import QtQuick 2.4
import QtQuick.Controls 2.12

Item 
    id: item1
    width: 800
    height: 600

    Page 
        anchors.fill: parent

        Rectangle 
            id: bound
            color: "#cad2d7"
            anchors.fill: parent
            anchors.bottomMargin: 0

            Button 
                id: button
                x: 8
                y: 8
                text: qsTr("Button")
            

            Rectangle 
                id: rectangle
                x: 0
                y: 74
                width: 800
                height: 200
                color: "#ffffff"
            

            Text 
                id: text1
                x: 14
                y: 293
                text: qsTr("Some text")
                font.pixelSize: 60
            
        
    

我也在使用 Python (PySide6),但不确定是否必须编写某种控制器来控制元素。 after.png before.png(注意你在 before.png 中看到的白色只是白色背景)

【问题讨论】:

请提供您的尝试。或者你想应用这个效果的一些代码。 @folibis 我刚刚从我的项目中添加了一些简化的代码,并进一步编辑了我的问题,以便更清楚我的意图。 【参考方案1】:

您似乎正在寻找类似accordion design pattern 的东西,您可以在其中展开以显示通常不可见的内容。在您描述的场景中,一种简单的方法是在灰色基础Rectangle 内使用ColumnLayout,其中切换中间内容的可见性。这是一个完整的独立示例:

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

Window 
    width: 640
    height: 480
    visible: true

    Rectangle 
        color: "lightgrey"
        width: parent.width
        height: column.implicitHeight // note this rectangle derives its height from column, and column derives its height from its children's implicitHeight or Layout.prefererredHeight

        ColumnLayout 
            id: column
            width: parent.width
            spacing: 0

            Button 
                text: qsTr("Button")
                onClicked: 
                    middleRectangle.visible = !middleRectangle.visible // toggle middleRectangle visibility
                
            

            Rectangle 
                id: middleRectangle
                Layout.fillWidth: true
                Layout.preferredHeight: 100
                visible: false  // note default is NOT visible

                Text 
                    text: qsTr("New text")
                    font.pixelSize: 60
                
            

            Text 
                text: qsTr("Some text")
                font.pixelSize: 60
            
        
    

需要注意的是:

visible: false 的项目不会占用ColumnLayout/RowLayout 中的空间,但是,不同定位器ColumnRow 的情况并非如此 包含所有内容的基础Rectangle 的高度来自ColumnLayout,而ColumnLayout 的高度又来自其子项 您提到的other question 似乎没有遵循您描述的设计,因此这种方法不一定适用于该场景,但它的某些部分会起作用,例如切换可见性。

【讨论】:

我明白了,我认为大体原理还是一样的,但我并不是要创建一个灵活的标签栏。我认为您使用手风琴设计模式一针见血,因为这正是我正在寻找的。这真的很有帮助;感谢您解释工作示例以及对Column/RowColumnLayout/RowLayout 的额外说明,因为我不确定这些。 希望我能在达到 15 次代表时为您的答案投票) 我赞成你的问题,所以现在你应该有足够的代表了 :)

以上是关于在 QML 中制作 Hide/Flex 项目的主要内容,如果未能解决你的问题,请参考以下文章

安卓上的 PySide QML 项目

这是 QML 中最小可行的 TreeView 模型吗?

QML:如何在 Pathview 中获取当前项目

QML 模块在项目中的优势是啥?

检查是不是正在绘制 QML 项目

如何在 QML 中获取项目的基类?