QML 拖放机制可以在不移动拖动项的情况下工作吗?
Posted
技术标签:
【中文标题】QML 拖放机制可以在不移动拖动项的情况下工作吗?【英文标题】:Can QML drag-and-drop mechanic work without drag item moving? 【发布时间】:2019-02-15 16:28:55 【问题描述】:我有一个列表视图和一个矩形。 ListView
的代表中有 DropArea
s,并且矩形在 Y 轴上启用了拖动及其相关属性(热点、目标)。
当我在 ListView 上上下移动矩形时,代表的 DropArea
s 正在注册 onEntered
信号。按预期工作。
但是,当矩形位于最顶部和底部坐标(list.y = 0
和list.height
)时,我使用SmoothedAnimation
上下滚动列表。所以矩形没有移动,列表代表的DropArea
s 在它下面移动。在这种情况下,onEntered
没有注册,因为没有拖动,矩形完全静止,虽然它的hotspot
进入和离开DropArea
s,但没有交互。
这是因为拖动机制在移动时一直在发送事件,并且它进入的任何DropArea
s 都可以注册该事件。就我而言,没有拖动,因此没有事件。
问题:拖动事件可以手动激活吗?我可以以某种方式模拟拖动吗?
【问题讨论】:
为什么需要它作为拖动事件?调用绑定到onEntered
的函数是不是就够了,还是真的依赖事件?
我需要知道矩形何时进入列表的拖动区域并且列表以不同的速度滚动。
你能提供一些代码来玩吗?
从那以后你找到解决办法了吗?
对不起,在所有工作中都忘记了这个问题,发布了答案。
【参考方案1】:
我已经设法通过手动更改列表上方矩形的hotSpot
属性来引发拖动事件。 QML 拖动文档说:
对热点的更改会触发具有更新位置的新拖动移动。
所以我每次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)
理论上应该可以通过在contentY
更改时重置hotSpot
点来工作,但测试显示不幸的是它不会触发新的拖动动作。 (错误或有意,我不知道)
现在你们中的一些更喜欢 Qt 和 QML 的人可能更了解这一点以及如何正确解决这个问题,但上述解决方案对我有用,在测试了我能想象得到的更清洁的解决方案之后,我决定了它。
【讨论】:
以上是关于QML 拖放机制可以在不移动拖动项的情况下工作吗?的主要内容,如果未能解决你的问题,请参考以下文章
Cocoa NSTextField 拖放需要子类...真的吗?