【问题标题】:Cancel a Drag & Drop for some specific items in a Gtk.TreeView取消 Gtk.TreeView 中某些特定项目的拖放
【发布时间】:2018-08-22 20:45:30
【问题描述】:

我在这里有一个Gtk.TreeView。大多数但不是所有的项目都应该能够拖放。在此示例中,第一个项目应该能够拖放,但应该是可选择的。

我怎样才能意识到这一点?也许我必须使用drag-begin 信号并在那里停止拖动。但我不知道怎么做。

#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import Gdk

class MainWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="TreeView Drag and Drop")
        self.connect("delete-event", Gtk.main_quit)
        self.set_default_size(400, 300)

        # "model" with dummy data
        self.store = Gtk.TreeStore(str)
        self.store.append(None, ['do not drag this'])
        self.store.append(None, ['drag this'])
        self.view = Gtk.TreeView(model=self.store)
        self.add(self.view)

        # build columsn
        colA = Gtk.TreeViewColumn('Col A', Gtk.CellRendererText(), text=0)
        self.view.append_column(colA)

        # DnD events
        self.view.connect("drag-data-received", self.drag_data_received)
        self.view.connect("drag-data-get", self.drag_data_get)
        self.view.connect("drag-begin", self.drag_begin)

        target_entry = Gtk.TargetEntry.new('text/plain', 2, 0)
        self.view.enable_model_drag_source(
                Gdk.ModifierType.BUTTON1_MASK,[target_entry], 
                Gdk.DragAction.DEFAULT|Gdk.DragAction.MOVE
        )
        self.view.enable_model_drag_dest(
                [target_entry],
                Gdk.DragAction.DEFAULT|Gdk.DragAction.MOVE
        )

    def drag_data_get (self, treeview, drag_context, data, info, time):
        model, path = treeview.get_selection().get_selected_rows()
        print('dd-get\tpath: {}'.format(path))
        data.set_text(str(path[0]), -1)

    def drag_data_received (self, treeview, drag_context, x,y, data,info, time):
        print('dd-received')
        store = treeview.get_model()
        source_iter = store.get_iter(data.get_text())
        dest_path, drop_pos = self.view.get_dest_row_at_pos(x, y)
        print('path: {} pos: {}'.format(dest_path, drop_pos))

    def drag_begin(self, widget, context):
        print(widget)
        print(context)

win = MainWindow()
win.show_all()
Gtk.main()

【问题讨论】:

    标签: python python-3.x gtk gtk3 pygobject


    【解决方案1】:

    你必须重载Gtk.TreeDragSource.do_row_draggable()

    class MyTreeStore (Gtk.TreeStore):
        # ...
        def do_row_draggable(self, path):
            # do your decision here
    
            return True # draggable
            return False # NOT draggable
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-14
      • 1970-01-01
      • 2011-01-30
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多