我正在测试一个看起来像这样的窗口:

alt text

将标签拖动到卡将标签链接到卡。将卡拖到标签上也是如此。

在两张卡之间丢弃标签或两个标签之间的卡是毫无意义的。我可以忽略这些结果 Handle...DataReceived 这样的功能:

if (dropPos != TreeViewDropPosition.IntoOrAfter &&
    dropPos != TreeViewDropPosition.IntoOrBefore)
    return;

但是,当拖动时,用户仍然会看到插入的选项:

alt text

如何防止这种情况发生?

有帮助吗?

解决方案

您需要连接到 drag-motion 信号并更改默认行为,因此它永远不会指示降落前/后的行为:

def _drag_motion(self, widget, context, x, y, etime):
    drag_info = widget.get_dest_row_at_pos(x, y)
    if not drag_info:
        return False
    path, pos = drag_info
    if pos == gtk.TREE_VIEW_DROP_BEFORE:
        widget.set_drag_dest_row(path, gtk.TREE_VIEW_DROP_INTO_OR_BEFORE)
    elif pos == gtk.TREE_VIEW_DROP_AFTER:
        widget.set_drag_dest_row(path, gtk.TREE_VIEW_DROP_INTO_OR_AFTER)
    context.drag_status(context.suggested_action, etime)
    return True

其他提示

您可以定义标签和卡的不同目标,在左侧小部件仅接受代表标签的目标。利用 Gtk.Drag.DestSet 方法。也许类似:

        Gtk.Drag.DestSet (widget, DestDefaults.All,
                      new TargetEntry[1] { new TargetEntry ("MYAPP_TAGS", TargetFlags.App, 1) },
                      DragAction.Default);

我试图通过以下方式使目的地发动运动事件:

        Gtk.Drag.DestSet (widget, DestDefaults.Motion,
                      new TargetEntry[1] { new TargetEntry ("MYAPP_TAGS", TargetFlags.App, 1) },
                      DragAction.Default);

从理论上讲,如果我正确理解,它应该起作用。但是我无法将其进行火力运动事件:(

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top