4

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

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

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

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

那么,是否有 python 等价物g_signal_stop_emission_by_name,或者我是否以错误的方式处理这个问题?

4

3 回答 3

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

于 2011-07-08T22:11:04.483 回答
1

它是gobject.GObject.emit_stop_by_name()。我不知道你正在做的事情是否会成功,但没有我能想到的“标准”方式。

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

于 2010-06-20T21:28:20.157 回答
0

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

于 2010-06-21T06:45:31.513 回答