可翻转重叠其他元素

Flipable overlapping other elements

在我的 QML 应用程序中,我正在尝试创建一个可以在按下按钮时翻转的项目网格。这样一个项目的背面应该会填满屏幕的大部分,直到它被翻转回来。

假设我从我的应用程序的以下视图开始

当我按下中心项目的问号按钮时,项目会翻转并轻微移动。在此之后我希望看到的是以下内容

蓝框是我物品的背面,它覆盖了大部分屏幕。按右上角的 'X'-按钮将再次翻转项目。

然而我第一次翻转后实际看到的是下面的

你可以看到我的网格中的部分项目被我翻转的项目覆盖而部分没有。

我使用的代码如下

import QtQuick 2.9
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.2
import QtQuick.Window 2.2
    
Window {
    id: main

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

    function absolutePos(item) {
        var my_x = item.x
        var my_y = item.y

        if (item.parent !== null) {
            var parent_pos = absolutePos(item.parent)
            my_x += parent_pos.x
            my_y += parent_pos.y
        }

        return {x: my_x, y: my_y}
    }

    GridLayout {
        columns: 5; rows: 3

        Repeater {
            model: 15
            delegate: Item {
                width: main.width / 5 - 10
                height: main.height / 3 - 10

                Flipable {
                    id: flipable
                    anchors.fill: parent

                    property bool flipped: false

                    front: Rectangle {
                        anchors.fill: parent
                        border.color: "black"
                        border.width: 2
                    }

                    back: Rectangle {
                        id: backSide
                        width: 580; height: 400

                        property var absolute_pos: absolutePos(this)

                        border.color: "blue"
                        border.width: 2

                        Button {
                            anchors.top: parent.top
                            anchors.right: parent.right

                            text: "X"

                            width: 30; height: 30

                            onClicked: {
                                flipable.flipped = !flipable.flipped
                            }
                        }
                    }

                    transform: [
                        Rotation {
                            id: rotation
                            origin.x: flipable.width / 2
                            origin.y: flipable.height / 2
                            axis.x: 0; axis.y: 1; axis.z: 0
                            angle: 0
                        },
                        Translate {
                            id: translation
                            x: 0; y: 0
                        }
                    ]

                    states: State {
                        name: "back"
                        PropertyChanges {
                            target: rotation
                            angle: 180
                        }
                        PropertyChanges {
                            target: translation
                            x: 490 - backSide.absolute_pos.x
                        }
                        PropertyChanges {
                            target: translation
                            y: 40 - backSide.absolute_pos.y
                        }
                        when: flipable.flipped
                    }

                    transitions: Transition {
                        ParallelAnimation {
                            NumberAnimation {
                                target: rotation
                                property: "angle"; duration: 300
                            }
                            NumberAnimation {
                                target: translation
                                property: "x"; duration: 300
                            }
                            NumberAnimation {
                                target: translation
                                property: "y"; duration: 300
                            }
                        }
                    }
                }

                Button {
                    anchors.top: parent.top
                    anchors.right: parent.right
                    text: "?"
                    width: 30; height: 30

                    onClicked: {
                        flipable.flipped = !flipable.flipped
                    }
                }
            }
        }
    }
}

我已经尝试通过手动将我的 Flipableparent 设置为 Window.contentItem 来实现这种效果,以便它始终位于任何其他项目之上。然而,这也不能解决问题,因为该项目仍将覆盖当前项目之后的兄弟姐妹。

此外,我仍然希望有一个解决方案不需要以某种神秘的方式操纵我的项目的 z 顺序。

我不确定你所说的“一些神秘的方式”是什么意思,但是改变你的委托的 z 属性 是完全没问题的:

delegate: Item {
    z: flipable.flipped ? 1 : 0
    // ...
}

您可能还想隐藏“?”翻转时的按钮:

visible: !flipable.flipped