我想在用户按住Button时打开一个上下文菜单(为了方便,我使用Button)。如果我这样做
Button
{
text: model.ualabel
MouseArea
{
preventStealing: true
anchors.fill: parent
onPressAndHold: uaContextMenu.open()
}
ContextMenu
{
id: uaContextMenu
MenuLayout
{
MenuItem { /**/ }
}
}
}
那么负责按住的MouseArea就会窃取所有的手势,即使按钮不能被点击。我到底做错了什么?我使用Qt 4.7并导入了 QtQuick 1.1
和 com.nokia.meego 1.0
谢谢你
我发现按住可以在QML的Button上这样模拟。
Button {
id: button
signal pressAndHold()
Timer {
id: longPressTimer
interval: 2000 //your press-and-hold interval here
repeat: false
running: false
onTriggered: {
button.pressAndHold()
}
}
onPressedChanged: {
if ( pressed ) {
longPressTimer.running = true;
} else {
longPressTimer.running = false;
}
}
}
问题是你的鼠标区域和Button的鼠标区域在竞争接收鼠标事件。试试设置 propogateComposedEvents: true
鼠标区域上,这应该允许事件在视觉栈中向下传播到按钮的鼠标区域。请参考 http:/qt-project.orgdocqt-5.0qtquickqml-qtquick2-mousearea.html#propagateComposedEvents-prop。 了解更多细节。
在阅读了这些评论之后,我的新建议是手动将mouseArea中的点击信号传播到按钮上。 这应该可以通过调用 buttonId.clicked()
它将在你的按钮上手动发出点击信号。
QML Button 有自己的 pressAndHold() 信号,所以你可以使用它。
Button {
text: model.ualabel
ContextMenu
{
id: uaContextMenu
MenuLayout
{
MenuItem { /**/ }
}
}
onPressAndHold: uaContextMenu.open()
}