首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyGObject:使用ToolPalette拖放

PyGObject:使用ToolPalette拖放
EN

Stack Overflow用户
提问于 2019-02-21 10:51:45
回答 1查看 83关注 0票数 0

我已经能够在Gtk.ToolPalette中使用拖放功能,但只有在设置Gtk.ToolButton.set_use_drag_window(True)时才能使用。但是,当单击ToolButton进行拖放时,实际上并不会在视觉上单击该按钮。我理解这是因为set_use_drag_window会导致所有事件(甚至按钮单击)都被截获为拖动事件。

文档中说,在Gtk.ToolPalette中使用拖放的最简单方法是使用所需的拖动源调色板和所需的拖动目标小部件调用Gtk.ToolPalette.add_drag_dest()。基于图形用户界面应用程序的复杂性,这与我所需要的是相反的,因为我需要设置ToolPalette,然后在创建DrawingArea之后向拖动源添加一个回调。

我继承了Gtk.TooPalette,为调色板的每个部分创建了一个Gtk.ToolItemGroup,然后我创建了按钮:

代码语言:javascript
复制
def toolbox_button(self, action_name, stock_id):
    button = Gtk.ToolButton.new_from_stock(stock_id)
    button.action_name = action_name
    button.set_use_drag_window(True)

    # Enable Drag and Drop
    button.drag_source_set(
        Gdk.ModifierType.BUTTON1_MASK,
        self.DND_TARGETS,
        Gdk.DragAction.COPY | Gdk.DragAction.LINK,
    )
    button.drag_source_set_icon_stock(stock_id)
    button.connect("drag-data-get", self._button_drag_data_get)

    return button

在DrawingArea上,我将其设为drag dest:

代码语言:javascript
复制
    view.drag_dest_set(
        Gtk.DestDefaults.MOTION,
        DiagramPage.VIEW_DND_TARGETS,
        Gdk.DragAction.MOVE | Gdk.DragAction.COPY | Gdk.DragAction.LINK,
    )

有没有一种方法可以让拖放操作与ToolPalette一起工作,同时仍然允许按钮正常工作?

EN

回答 1

Stack Overflow用户

发布于 2019-03-31 04:34:41

我的另一位贡献者深入研究了GTK源代码,发现Gtk.ToggleToolButton实际上有一个子按钮,目前还没有文档记录。如果您将拖动源设置为此“内部按钮”,则拖放将起作用。

代码语言:javascript
复制
def toolbox_button(action_name, stock_id, label, shortcut):
    button = Gtk.ToggleToolButton.new()
    button.set_icon_name(stock_id)
    button.action_name = action_name
    if label:
        button.set_tooltip_text("%s (%s)" % (label, shortcut))

    # Enable Drag and Drop
    inner_button = button.get_children()[0]
    inner_button.drag_source_set(
        Gdk.ModifierType.BUTTON1_MASK | Gdk.ModifierType.BUTTON3_MASK,
        self.DND_TARGETS,
        Gdk.DragAction.COPY | Gdk.DragAction.LINK,
    )
    inner_button.drag_source_set_icon_stock(stock_id)
    inner_button.connect(
        "drag-data-get", self._button_drag_data_get, action_name
    )

    return button
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54798501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档