我想让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
:覆盖ma1
的MenuBar
和填充ma2
的ApplicationWindow
。后者的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/