拖动对GtkTreeView的支持,其中模型被过滤和排序

时间:2010-06-20 13:59:30

标签: python pygtk gtktreeview

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

无论如何我尝试实现它,为drag-dest接收和拖放信号提供处理程序,但仍然会出现以下错误:

  

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,或者我是以错误的方式解决这个问题?

3 个答案:

答案 0 :(得分:4)

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

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 *是相同的。

答案 1 :(得分:1)

gobject.GObject.emit_stop_by_name()。我不知道你所做的事情是否会成功,但我认为没有“标准”的方式。

您可以尝试使用Py-gtktree而不是实现自己:请参阅名为drag_between_tree_and_list.py的示例。您可以在右侧对树进行排序,并且仍然能够拖动到自动放置在“正确”位置的项目。它不允许将draggin放在树中的任何位置,但出于不同的原因:示例显式请求它。

答案 2 :(得分:0)

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