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

Posted

技术标签:

【中文标题】QML 拖放机制可以在不移动拖动项的情况下工作吗?【英文标题】:Can QML drag-and-drop mechanic work without drag item moving? 【发布时间】:2019-02-15 16:28:55 【问题描述】:

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

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

但是,当矩形位于最顶部和底部坐标(list.y = 0list.height)时,我使用SmoothedAnimation 上下滚动列表。所以矩形没有移动,列表代表的DropAreas 在它下面移动。在这种情况下,onEntered 没有注册,因为没有拖动,矩形完全静止,虽然它的hotspot 进入和离开DropAreas,但没有交互。

这是因为拖动机制在移动时一直在发送事件,并且它进入的任何DropAreas 都可以注册该事件。就我而言,没有拖动,因此没有事件。

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

【问题讨论】:

为什么需要它作为拖动事件?调用绑定到onEntered的函数是不是就够了,还是真的依赖事件? 我需要知道矩形何时进入列表的拖动区域并且列表以不同的速度滚动。 你能提供一些代码来玩吗? 从那以后你找到解决办法了吗? 对不起,在所有工作中都忘记了这个问题,发布了答案。 【参考方案1】:

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

对热点的更改会触发具有更新位置的新拖动移动。

所以我每次ListviewcontentY更改时都这样做(发生垂直滚动)

    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 拖放需要子类...真的吗?

QML:如何通过拖放重新排序中继器项目?里面有一些工作代码

如何使拖放列表进行复制而不是移动列表项

我可以在不升级角度版本的情况下更新我的 monorepo nx 工作区吗?

拖放防止多个项目同时移动

可以在不使用通用寄存器的情况下将 8 位从 XMM 寄存器移动到内存吗?