对过滤和排序模型的GtkTreeView提供拖放支持
正如标题所说,我有一个gtk.TreeView
,它的模型是经过排序和过滤的。根据文档的说明:“拖放重新排序行只适用于未排序的存储。”另外的信息主要涉及使用外部来源,但在这种情况下我并不需要。
我还是尝试实现了一下,给拖放目标接收和拖放信号提供了处理程序,但仍然遇到了以下错误:
GtkWarning: 当使用不支持GtkTreeDragDest接口的模型并启用拖放时,您必须重写GtkTreeView的默认'drag_data_received'处理程序。最简单的方法是连接到'drag_data_received',并在您的信号处理程序中调用g_signal_stop_emission_by_name(),以防止默认处理程序运行。查看gtktreeview.c中的默认处理程序源代码,可以了解您的处理程序应该做什么。(gtktreeview.c在GTK源代码中。)如果您使用的语言不是C,可能会有更自然的方法来重写默认处理程序,比如通过继承。
尽管如此,虽然我还没有实现,但看起来我可以让它工作,因为它没有崩溃。不过,这个警告我还是希望能避免。
那么,有没有Python中等同于g_signal_stop_emission_by_name
的东西,或者我是不是走错了方向?
3 个回答
我通过在自己的拖放接收信号处理程序中使用 treeview.stop_emission('drag-drop-received') 来解决了这个警告。也许 doublep 提到的方法也能奏效,不过我还没试过。
这是 gobject.GObject.emit_stop_by_name()
。我不确定你正在做的事情是否能成功,但我想不出有什么“标准”的方法。
与其自己去实现,不如试试 Py-gtktree:可以看看一个叫 drag_between_tree_and_list.py
的例子。你可以在右边的树形结构中进行排序,同时还能把拖动的项目放到“正确”的位置。虽然它不允许你随意拖动到树形结构的任何地方,但这是因为这个例子明确要求这样做。
我有点困惑,因为我已经有了一个“拖放”处理程序,但在我实现了以下内容后,问题就解决了:
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 文档,*emit_stop_by_name* 和 *stop_emission* 是完全一样的。