QML拖放机制可以在不移动拖动项的情况下工作吗?

时间:2018-09-11 08:00:53

标签: drag-and-drop qml drag

我有一个列表视图和一个顶部的矩形。 ListView的代表中有DropArea个,并且矩形在Y轴上启用了具有相关属性(热点,目标)的拖动。

当我在ListView上上下移动矩形时,代表的DropArea个正在注册onEntered信号。按预期工作。

但是,当矩形位于最高和最低坐标(SmoothedAnimationlist.y = 0)上时,我正在使用list.height上下滚动列表。因此该矩形没有移动,并且列表的代表的DropArea在其下方移动。在那种情况下,onEntered没有注册,因为没有拖动,矩形完全静止,并且尽管其hotspot正在进入和离开DropArea,但是没有交互。

这是因为拖动技工在移动时始终发送事件,并且其中的任何DropArea都可以注册事件。就我而言,没有拖动,因此没有事件。

问题:拖动事件可以手动激活吗?我可以以某种方式模拟拖动吗?

1 个答案:

答案 0 :(得分:0)

我设法通过手动更改列表上方矩形的hotSpot属性来引发拖动事件。 QML Drag文档说:

  

更改为hotSpot会触发具有更新位置的新拖动动作。

因此,每次Listview contentY更改(发生垂直滚动)时,我都会这样做

    onContentYChanged:
    {
        rectangle.Drag.hotSpot.x += 0.0001
        rectangle.Drag.hotSpot.x -= 0.0001
    }

但是,事后看来,这是一个“ hacky”解决方案。 hotSpot属性是QPointF类属性(link)。这意味着可以使用多种方法(setX,setY,rx,ry ..)进行设置。例如,这:

rectangle.hotSpot += Qt.point(0,0)

rectangle.hotSpot = Qt.point(rectangle.hotSpot.x,rectangle.hotSpot.y)

理论上应该通过在hotSpot发生变化时重置contentY点来工作,但是不幸的是测试表明它不会触发新的拖动动作。 (错误或故意的,我不知道)

现在,一些对Qt和QML更加了解的人可能对此有更多了解,以及如何正确解决该问题,但是上述解决方案对我有用,在测试了我可以想象得到的更干净解决方案之后,我选择了它。