【问题标题】:Drag drop support for a GtkTreeView where the model is filtered and sorted对模型进行过滤和排序的 GtkTreeView 的拖放支持
【发布时间】:2013-01-24 03:02:41
【问题描述】:

正如标题所示,我有一个gtk.TreeView,其模型已排序和过滤。根据documentation:“拖放重新排序行仅适用于未排序的商店。”。给出的唯一其他信息与使用外部资源有关,在这种情况下我不需要。

我还是尝试实现它,为接收到的拖放信号和拖放信号提供处理程序,但仍然收到以下错误:

GtkWarning:当使用不支持 GtkTreeDragDest 接口并启用拖放的模型时,您必须覆盖 GtkTreeView 上的默认 'drag_data_received' 处理程序。最简单的方法是连接到“drag_data_received”并在信号处理程序中调用 g_signal_stop_emission_by_name() 以防止默认处理程序运行。查看 gtktreeview.c 中默认处理程序的源代码,了解您的处理程序应该做什么。 (gtktreeview.c 在 GTK 源代码中。)如果您使用的不是 C 语言的 GTK,则可能有一种更自然的方式来覆盖默认处理程序,例如通过推导。

尽管如此,虽然我还没有实现它,但看起来我可以让它工作,因为它不会崩溃。然而,这是一个我宁愿没有的警告。

那么,有没有与 g_signal_stop_emission_by_name 等效的 python,还是我走错了路?

【问题讨论】:

    标签: python pygtk gtktreeview


    【解决方案1】:

    我有点困惑,因为我已经有了一个“拖放”处理程序,但是在我实现以下内容后就被排序了:

    def __init__(self):
        self.treeview.connect("drag_data_received", self.on_drag_data_received)
    
    def on_drag_data_received(self, widget, drag_context, x, y, selection_data, info, timestamp):
        widget.stop_emission('drag_data_received')
    

    补充一下,根据pygtk docs,*emit_stop_by_name* 和 *stop_emission* 是相同的。

    【讨论】:

      【解决方案2】:

      它是gobject.GObject.emit_stop_by_name()。我不知道你所做的是否会成功,但我想不出“标准”的方式。

      您可以尝试使用Py-gtktree,而不是自己实现:参见名为drag_between_tree_and_list.py 的示例。您可以对右侧的树进行排序,并且仍然可以将拖入的项目拖入其中,并自动将其放置在“正确”位置。它不允许将任何地方拖入树中,但出于不同的原因:示例明确要求这样做。

      【讨论】:

        【解决方案3】:

        我通过在自己的拖放接收信号处理程序中使用 treeview.stop_emission('drag-drop-received') 摆脱了警告。或许doublep的方法也可以,虽然我没试过。

        【讨论】:

          猜你喜欢
          • 2012-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多