GTK 中的拖放 [src]

拖放 (DND) 是一种用户交互模式,用户可以将 UI 元素从一个位置拖动到另一个位置,既可以在单个应用程序中进行拖放,也可以在不同的应用程序窗口之间进行拖放。

当释放元素时,数据会根据双方协商的拖放操作从源传送到目的地。最常见的是“复制”,但也可以是“移动”或“链接”,具体取决于数据的种类以及拖动操作的设置方式。

本章概述了 GTK 中如何使用事件控制器来处理拖放。

拖放源

要通过 DND 提供数据,您可以创建 GtkDragSource。拖放源是事件控制器,当用户单击并拖动小组件时,它们会启动拖放操作。

可以提前使用所需的拖放操作和要传输的数据来设置拖放源。但是,也可以通过连接到 GtkDragSource::prepare 信号来在拖放操作即将开始时提供数据。

DND 操作开始时,GtkDragSource 会发出 GtkDragSource::drag-begin 信号,当操作完成时,会发出 GtkDragSource::drag-end 信号。但通常无需处理这些信号。需要 ::drag-end 处理程序的一个情况是实现 GDK_ACTION_MOVE

放置目标

要通过 DND 接收数据,您需要创建一个 GtkDropTarget,并告诉它要接受哪种类型的数据。需要连接到 GtkDropTarget::drop 信号才能在发生 DND 操作时接收数据。

DND 操作进行期间,GTK 会在指针移动到与放置目标相关联的小组件时提供更新。 GtkDropTarget::enterGtkDropTarget::leaveGtkDropTarget::motion 信号会为此目的发出。

GtkDropTarget 提供一个简单的 API,并且仅在数据完全传输后才提供数据。如果您需要自己处理数据传输(例如,在传输期间提供进度信息),可以使用更复杂的 GtkDropTargetAsync

其他注意事项

有时需要在 DND 操作正在进行时更新目标的 UI,比如说滚动或展开视图,或切换页面。通常,此类 UI 更改是由将光标悬停在相关的小组件上触发的。

GtkDropControllerMotion 是一个事件控制器,可以帮助实现此类行为。它与 GtkEventControllerMotion 非常相似,但会在 DND 操作期间提供事件。