我有一个列表视图和一个顶部的矩形。 ListView
的代表中有DropArea
个,并且矩形在Y轴上启用了具有相关属性(热点,目标)的拖动。
当我在ListView上上下移动矩形时,代表的DropArea
个正在注册onEntered
信号。按预期工作。
但是,当矩形位于最高和最低坐标(SmoothedAnimation
和list.y = 0
)上时,我正在使用list.height
上下滚动列表。因此该矩形没有移动,并且列表的代表的DropArea
在其下方移动。在那种情况下,onEntered
没有注册,因为没有拖动,矩形完全静止,并且尽管其hotspot
正在进入和离开DropArea
,但是没有交互。
这是因为拖动技工在移动时始终发送事件,并且其中的任何DropArea
都可以注册事件。就我而言,没有拖动,因此没有事件。
问题:拖动事件可以手动激活吗?我可以以某种方式模拟拖动吗?
答案 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更加了解的人可能对此有更多了解,以及如何正确解决该问题,但是上述解决方案对我有用,在测试了我可以想象得到的更干净解决方案之后,我选择了它。