Qt 检测QML中按钮的按住

Qt 检测QML中按钮的按住,qt,button,menu,qt4,qml,Qt,Button,Menu,Qt4,Qml,我想在用户按住按钮时打开一个上下文菜单(我使用按钮是为了方便)。如果我这样做 然后,负责按住的鼠标会窃取所有手势,即使无法单击按钮。我做错了什么?我正在使用Qt 4.7并导入QtQuick 1.1和com.nokia.meego 1.0 谢谢问题是您的鼠标区域正在与按钮的鼠标区域竞争以接收鼠标事件。尝试在鼠标区域上设置propogateComposedEvents:true,这将允许事件在可视堆栈中向下传播到按钮的鼠标区域。有关更多详细信息,请参阅 阅读完评论后,我的新建议是手动将鼠标earea

我想在用户按住按钮时打开一个上下文菜单(我使用按钮是为了方便)。如果我这样做

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


谢谢

问题是您的鼠标区域正在与按钮的鼠标区域竞争以接收鼠标事件。尝试在鼠标区域上设置
propogateComposedEvents:true
,这将允许事件在可视堆栈中向下传播到按钮的鼠标区域。有关更多详细信息,请参阅


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

我发现可以在QML的按钮上模拟按住,如下所示:

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;
        }
    }
}

QML按钮有自己的pressAndHold()信号,所以您可以使用它

    Button {

        text: model.ualabel

        ContextMenu
        {
            id: uaContextMenu

            MenuLayout
            {
                MenuItem { /**/ } 
            }
        }

        onPressAndHold: uaContextMenu.open()
    }

但是我使用的是Qt4.7,我无法做到这一点:那么,如果不修改按钮组件,就无法使用按钮组件来获得所需的鼠标事件。虽然控件是开源的,而且相当简单,但这实际上并没有那么困难。只需将代码复制到本地项目中的新qml文件中并进行本地更改。虽然,,我不完全确定这个项目有哪些许可证限制。问题是IMPLICITSIZETEM不是qml文件HMMM。作为最后的尝试,您可以让您的鼠标区域处理单击的信号,并在处理程序中从您的鼠标区域导航按钮的内部结构,并找到内部鼠标earea和手动发出单击的信号。已尝试此操作。。。但QML抱怨按下的
是只读的(这是制作
动画所必需的),手动传播并不理想,因为按下按钮时不会改变颜色。也许您想澄清这个答案适用于哪个版本的Qt。问题被标记为qt4。
    Button {

        text: model.ualabel

        ContextMenu
        {
            id: uaContextMenu

            MenuLayout
            {
                MenuItem { /**/ } 
            }
        }

        onPressAndHold: uaContextMenu.open()
    }