Перетащите поддержку для GtkTreeView, где модель фильтруется и сортируется - PullRequest
4 голосов
/ 20 июня 2010

Как видно из названия, у меня есть gtk.TreeView, чья модель отсортирована и отфильтрована. Согласно документации : «Перетаскивание строк с помощью перетаскивания работает только с несортированными хранилищами». Единственная предоставленная информация касается использования внешних источников, которые в данном случае мне не нужны.

Я все равно пытался реализовать его, предоставляя обработчики для сигналов перетаскивания-приема и перетаскивания, но все равно получал следующую ошибку:

GtkWarning: Вы должны переопределить стандартный обработчик drag_data_received в GtkTreeView при использовании моделей, не поддерживающих интерфейс GtkTreeDragDest и включающих перетаскивание. Самый простой способ сделать это - подключиться к drag_data_received и вызвать g_signal_stop_emission_by_name () в вашем обработчике сигналов, чтобы предотвратить запуск обработчика по умолчанию. Посмотрите исходный код обработчика по умолчанию в gtktreeview.c, чтобы понять, что должен делать ваш обработчик. (gtktreeview.c находится в исходном коде GTK.) Если вы используете GTK из языка, отличного от C, может быть более естественный способ переопределить обработчики по умолчанию, например, через деривацию.

Несмотря на это, хотя я еще не реализовал это, похоже, я мог бы заставить его работать, так как он не падает. Тем не менее, это предупреждение, которое я бы предпочел не иметь.

Итак, есть ли в Python эквивалент g_signal_stop_emission_by_name, или я поступаю неправильно?

Ответы [ 3 ]

4 голосов
/ 09 июля 2011

Я немного запутался, поскольку у меня уже был обработчик «перетаскивания», но он был отсортирован, когда я реализовал следующее:

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 голос
/ 21 июня 2010

Это gobject.GObject.emit_stop_by_name().Я не знаю, будет ли то, что вы делаете, удастся, но я не могу придумать "стандартный" способ.

Вместо того, чтобы реализовать себя, вы можете попробовать использовать Py-gtktree : см. пример под названием drag_between_tree_and_list.py.Вы можете отсортировать дерево справа и по-прежнему иметь возможность перетаскивать в него элементы, которые автоматически перетаскиваются в правильное положение.Он не позволяет перетаскивать куда-либо в дерево, но по другой причине: пример явно запрашивает это.

0 голосов
/ 21 июня 2010

Я избавился от предупреждения, используя treeview.stop_emission («перетаскивание-получено») в моем собственном обработчике сигнала перетаскивания-получено. Возможно, метод doublep тоже подойдет, хотя я не пробовал.

...