我想在长按之后拖动我的自定义按钮QML。我已经实现了这种行为,但问题是在启用drag
之后,我需要再次按下按钮才能实际开始拖动。如果我想在长按后移动按钮而不释放按钮,我应该如何实现这种机制?
以下是我的按键代码(onReleased
和onLongPressed
是我自己的信号):
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")
}
}
}
有什么想法吗?
答案 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 ;
的接受会给出一个有趣的事件连接方法。 Documentation说MouseEvent
:
将接受设置为true可防止鼠标事件发生 传播到此项目下方的项目。通常,如果该项目作用于 鼠标事件然后它应该被接受,以便在项目中较低的项目 堆叠顺序也不会响应同一事件。
在这种情况下,我们可以采用相反的方法 not 接受该事件。这样,MouseEvent::accepted
事件可用于两者激活拖动并实际执行它。然后pressed
可以在MouseEvent
事件中接受(隐式),在拖动结束时发生。
以下是遵循此方法的简单示例。在按住鼠标并按住时,release
已设置并且可以开始拖动,而当释放鼠标时,drag.target
将被删除,从而消除拖动行为。要测试它,只需在矩形上按住鼠标,当它改变颜色时,只需将其拖动即可。
drag.target
这种简单的方法也可以与您的自定义信号完美配合。