长按后拖动

时间:2015-04-28 13:00:54

标签: qt qml drag qtquick2

我想在长按之后拖动我的自定义按钮QML。我已经实现了这种行为,但问题是在启用drag之后,我需要再次按下按钮才能实际开始拖动。如果我想在长按后移动按钮而不释放按钮,我应该如何实现这种机制?

以下是我的按键代码(onReleasedonLongPressed是我自己的信号):

ButtonWidget.SoftButtonUI
{
    id:softButtonDelegate2
    x:500
    y:300
    labelText: "button"
    iconImageSource: path
    isGrayedOut: false

    Drag.active: dragArea2.drag.active
    Drag.hotSpot.x: 10
    Drag.hotSpot.y: 10
    onReleased:
    {
        console.log("onClicked")
    }

    onLongPressed:
    {
        console.log("onLongPressed")
        dragArea2.enabled = true
    }

    MouseArea {
        id: dragArea2
        enabled: false
        anchors.fill: parent
        drag.target: parent
        onReleased: parent.Drag.drop()
        onClicked: {
            console.log("MouseArea onClicked")
        }
        onPressAndHold: {
            console.log("MouseArea  onPressAndHold")
        }
    }
}

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

一般来说,您可以连接不同的信号并连接操作,如本page中所述。你应该看看它,因为它充满了很好的有用信息。

然而,当谈到鼠标事件时, DELIMITER $$ CREATE PROCEDURE `DictionaryInsert`(OUT IdWord INT, IN NWord VARCHAR(150)) BEGIN IF NOT EXISTS (SELECT IdWord FROM Dictionary WHERE Word = NWord) THEN INSERT INTO Dictionary(Word) VALUES(NWord); SELECT SCOPE_IDENTITY() INTO IdWord; END IF; END$$ DELIMITER ; 的接受会给出一个有趣的事件连接方法。 DocumentationMouseEvent

  

将接受设置为true可防止鼠标事件发生   传播到此项目下方的项目。通常,如果该项目作用于   鼠标事件然后它应该被接受,以便在项目中较低的项目   堆叠顺序也不会响应同一事件。

在这种情况下,我们可以采用相反的方法 not 接受该事件。这样,MouseEvent::accepted事件可用于两者激活拖动并实际执行它。然后pressed可以在MouseEvent事件中接受(隐式),在拖动结束时发生。

以下是遵循此方法的简单示例。在按住鼠标并按住时,release已设置并且可以开始拖动,而当释放鼠标时,drag.target将被删除,从而消除拖动行为。要测试它,只需在矩形上按住鼠标,当它改变颜色时,只需将其拖动即可。

drag.target

这种简单的方法也可以与您的自定义信号完美配合。