在QML中检测到按住按钮的情况。

问题描述 投票:3回答:3

我想在用户按住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.1com.nokia.meego 1.0

谢谢你

qt button menu qt4 qml
3个回答
3
投票

我发现按住可以在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;
        }
    }
}

1
投票

问题是你的鼠标区域和Button的鼠标区域在竞争接收鼠标事件。试试设置 propogateComposedEvents: true 鼠标区域上,这应该允许事件在视觉栈中向下传播到按钮的鼠标区域。请参考 http:/qt-project.orgdocqt-5.0qtquickqml-qtquick2-mousearea.html#propagateComposedEvents-prop。 了解更多细节。

在阅读了这些评论之后,我的新建议是手动将mouseArea中的点击信号传播到按钮上。 这应该可以通过调用 buttonId.clicked() 它将在你的按钮上手动发出点击信号。


0
投票

QML Button 有自己的 pressAndHold() 信号,所以你可以使用它。

    Button {

        text: model.ualabel

        ContextMenu
        {
            id: uaContextMenu

            MenuLayout
            {
                MenuItem { /**/ } 
            }
        }

        onPressAndHold: uaContextMenu.open()
    }
© www.soinside.com 2019 - 2024. All rights reserved.