如何解决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 举报,一经查实,本站将立刻删除。