Python 对过滤和排序模型的GtkTreeView的拖放支持

Python 对过滤和排序模型的GtkTreeView的拖放支持,python,pygtk,gtktreeview,Python,Pygtk,Gtktreeview,正如标题所示,我有一个gtk.TreeView,它的模型被排序和过滤。根据“拖放行重新排序仅适用于未排序的存储”。给出的唯一其他信息与使用外部资源有关,在本例中,我不需要外部资源 无论如何,我都尝试实现它,为drag dest接收到的和拖放信号提供处理程序,但仍然得到以下错误: GtkWarning:当使用不支持GTKTreeDragTest接口的模型并启用拖放时,必须覆盖GtkTreeView上的默认“drag_data_received”处理程序。最简单的方法是连接到“drag_data_r

正如标题所示,我有一个
gtk.TreeView
,它的模型被排序和过滤。根据“拖放行重新排序仅适用于未排序的存储”。给出的唯一其他信息与使用外部资源有关,在本例中,我不需要外部资源

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

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

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


那么,是不是有一种python等价物,它类似于g_signal_stop_emission by_name,还是我走错了方向?

它是
gobject.gobject.emit_stop_by_name()
。我不知道你正在做的事情是否会成功,但我想不出什么“标准”方法


您可以尝试使用:参见名为
的示例,在\u tree\u和\u list.py之间拖动\u。您可以对右侧的树进行排序,并且仍然能够将拖入的项目自动放置在“正确”的位置。它不允许拖动到树中的任何位置,但原因不同:示例明确要求这样做。

我通过在自己的拖放接收信号处理程序中使用treeview.stop_emission(“drag-drop-received”)来消除警告。也许doublep的方法也会起作用,尽管我还没有尝试过。

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

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')
只需添加,根据,*emit\u stop\u by\u name*和*stop\u emission*是相同的