我想让ApplicationWindow具有自动隐藏的menuBar,当鼠标光标位于窗口的最上方时会显示该代码。 QML有可能吗?

PS:我正在使用Qt 5.3。

提前致谢。

最佳答案

您可以利用内部属性,即以“__”开头的属性。由于它们是内部的,因此即使在IMO中,功能也可能会在将来的版本中中断,在这种情况下,这种可能性不大。

通过使用内部属性,您可以利用__contentItem的图形容器MenuBar并对其属性进行动画处理以获得所需的结果。这是一种可能的方法;它适用于Qt 5.3/Qt 5.4/Qt 5.5(我可以对其进行测试的版本):

ApplicationWindow {
    id: app
    visible: true
    width: 400
    height: 300

    property real hideValue: 0
    Behavior on hideValue {
        NumberAnimation {duration: 200}
    }

    menuBar:  MenuBar {
        id: menu
        //__contentItem.scale: value                        // (1)
        //__contentItem.opacity: hideValue                  // (2)
        __contentItem.transform: Scale {yScale: hideValue}  // (3)

        Menu {
            id: m1
            title: "File"
            MenuItem { text: "Open..."
                onTriggered: {
                   hideValue = 0                            // hide the bar
                }
            }
            MenuItem { text: "Close"
                onTriggered: {
                   hideValue = 0                            // hide the bar
                }
            }
        }
    }


    Button{
        id: b1
        anchors.centerIn: parent
        text: "CLICK ME!"
        width: 100
        height: 100
    }

    MouseArea {
        id: ma1
        anchors.top: parent.top
        anchors.left: parent.left
        anchors.right: parent.right
        height: menu.__contentItem.implicitHeight
        hoverEnabled: true

        onEntered: {
            hideValue = 1                            // show the bar
        }
    }

    MouseArea {
        id: ma2
        anchors.fill: parent
        hoverEnabled: true
        z: -1

        onEntered: {
            m1.__dismissMenu()
            hideValue = 0                            // hide the bar
        }
    }
}

总结代码:
  • 定义了两个MouseArea:覆盖ma1MenuBar和填充ma2ApplicationWindow。后者的z负数位于窗口的任何其他元素下,包括ma1:这样,它就不会干扰与添加的任何元素相关的事件(例如示例按钮b1)。
  • ma1将名为hideValue的属性设置为1,而ma2将其带回到0。该属性用于__contentItem的可视属性(请参见代码中的(1)(2)(3))来隐藏/显示MenuBar。在Behaviour属性上使用一个简单的hideValue可以确保过渡是平滑的。
  • 内部函数__dismissMenu()用于确保在Menu失去焦点时关闭打开的MenuBar
  • 触发MenuItem时,会直接重置hideValue属性以确保正确隐藏。
  • 关于qt - 如何自动隐藏ApplicatioWindow menuBar?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27299767/

    10-11 18:11