4

当用户按住按钮时,我想打开一个上下文菜单(为方便起见,我使用按钮)。如果我做

    Button
    {
        text: model.ualabel

        MouseArea
        {
            preventStealing: true
            anchors.fill: parent
            onPressAndHold: uaContextMenu.open()
        }

        ContextMenu
        {
            id: uaContextMenu
            MenuLayout
            {
                MenuItem { /**/ } 
            }
        }
    }

然后负责 pressAndHold 的 MouseArea 会窃取所有手势,即使无法单击 Button。我究竟做错了什么?我正在使用 Qt 4.7 并导入QtQuick 1.1com.nokia.meego 1.0

谢谢

4

3 回答 3

6

我发现可以像这样在 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;
        }
    }
}
于 2015-11-25T10:32:10.643 回答
1

问题是您的鼠标区域正在与 Button 的鼠标区域竞争以接收鼠标事件。尝试propogateComposedEvents: true在您的鼠标区域上进行设置,这应该允许事件在视觉堆栈中向下传播到按钮的鼠标区域。有关详细信息,请参阅http://qt-project.org/doc/qt-5.0/qtquick/qml-qtquick2-mousearea.html#propagateComposedEvents-prop

阅读评论后,我的新建议是手动将 mouseArea 中的 clicked 信号传播到按钮。这应该可以通过调用buttonId.clicked()which 将在您的按钮上手动发出 clicked 信号来实现。

于 2013-07-25T13:38:52.410 回答
0

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

    Button {

        text: model.ualabel

        ContextMenu
        {
            id: uaContextMenu

            MenuLayout
            {
                MenuItem { /**/ } 
            }
        }

        onPressAndHold: uaContextMenu.open()
    }
于 2020-05-25T10:47:03.770 回答