微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Gtk.TreeView 拖放适用于 Gtk.TreeStore 但不适用于自定义 Gtk.TreeModel 模型

如何解决Gtk.TreeView 拖放适用于 Gtk.TreeStore 但不适用于自定义 Gtk.TreeModel 模型

我已经研究出如何在为模型使用现成的 Gtk.TreeStore 时让拖放工作,但是当使用自定义 Gtk.TreeModel 时,无法开始拖动操作。我猜这是一个丢失的信号回调或标志,但查看 API 文档我不知道它可能是什么。很确定这与树视图本身无关。

为了演示,在下面的精简程序中,将底部附近的 if False 切换到 if True 以选择使用哪个模型。

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

class MyModel(GObject.GObject,Gtk.TreeModel):
    def __init__(self):
        self.cntRows = 10
        GObject.GObject.__init__(self)

    def do_get_iter(self,path):
        idx = path.get_indices()
        idxRow = idx[0]
        if idxRow >= self.cntRows:
            return (False,None)
        treeiter = Gtk.TreeIter()
        treeiter.user_data2 = idxRow
        return(True,treeiter)

    def do_iter_next(self,treeiter):
        if treeiter.user_data2 < self.cntRows - 1:
            treeiter.user_data2 += 1
            return (True,treeiter)
        return (False,None)

    def do_iter_has_child(self,treeiter):
        return False
    def do_iter_children(self,treeiter):
        return (False,None)
    def do_iter_n_children(self,parent):
        return 0
    def do_iter_parent(self,child):
        return (False,None)
    def do_iter_nth_child(self,treeiter,idx):
        return (False,None)
    def do_get_path(self,treeiter):
        return Gtk.TreePath( (treeiter.user_data2,) )
    def do_get_value(self,idxcol):
        return "Col {0} Row {1}".format(idxcol,treeiter.user_data2)
    def do_get_n_columns(self):
        return 1
    def do_get_column_type(self,idx):
        return str
    def do_get_flags(self):
        return Gtk.TreeModelFlags.ITERS_PERSIST

    def evtDragDataGet(self,treeview,context,selection,idTarget,time):
        print("evtDragDataGet()") 
    def evtDropDataRecv(self,x,y,time):
        print("evtDropDataRecv()")

if __name__ == '__main__':
    signal.signal(signal.SIGINT,signal.SIG_DFL)
    model = MyModel()
    tree = Gtk.TreeView()
    if False:
        # This does not work..
        tree.set_model(model)
    else:
        # This works..
        liststore = Gtk.ListStore(str)
        store = Gtk.TreeStore(str,str)
        for i in range(5):
            store.append(None,['Item {}'.format(i),'{}'.format(i*100)])
        tree.set_model(store)
    col = Gtk.TreeViewColumn("Title",Gtk.CellRendererText(),text=0)
    tree.append_column(col)
    target = [('TREE_ROW',Gtk.TargetFlags.SAME_WIDGET,0)]
    tree.enable_model_drag_source(
        Gdk.ModifierType.BUTTON1_MASK,target,Gdk.DragAction.DEFAULT | Gdk.DragAction.MOVE)
    tree.enable_model_drag_dest(target,Gdk.DragAction.DEFAULT)
    tree.connect('drag-data-get',model.evtDragDataGet)
    tree.connect('drag-data-received',model.evtDropDataRecv)
    wndScroll = Gtk.ScrolledWindow()
    wndScroll.add(tree)
    wndMain = Gtk.Window()
    wndMain.connect( 'destroy',Gtk.main_quit )
    wndMain.add(wndScroll)
    wndMain.resize(400,400)
    wndMain.show_all()
    Gtk.main()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。