正如标题所示,我有一个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,或者我是以错误的方式解决这个问题?
答案 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的方法也可以使用,虽然我还没有尝试过。