2010-05-14 79 views
1

我有一个简单gtk.TreeViewgtk.ListStore模型和set_reorderable(True),我要赶emited时通过拖动用户订货&删除列表中的信号/事件,但该文件并没有太大的帮助:抓PyGTK的TreeView的重新排序

“应用程序可以通过连接到模型的信号来聆听这些更改”

因此,我试图连接模型(ListStore)信号......但出人意料! ListStore没有信号,所以你被调度到TreeModel信号,然后我试图连接TreeModel“rows-reordered”信号,没有幸运。

我该如何捕捉用户执行的列表重新排序?

+0

请注意,Gtk文档声明“当DND重新排序行时,此信号不会被发出,因为这是通过删除然后重新插入行来实现的。 – alldayremix 2013-09-29 18:35:49

回答

3

目前在PyGTK中没有办法做到这一点。 “rows-reordered”是正确的信号,但是除了“以某种方式重新排序”之外,不可能从PyGTK中派生任何信息。在C GTK +中,您可以使用相同的信号并在回调中获取所需的信息,但不能在Python中获取。

+0

但是这个信号并没有在PyGTK中出现,至少我可以手动检查模型是否被证实。 – mkotechno 2010-05-14 22:20:41

+2

@mkotechno:你到底在干什么?如果你拖动'拖'行,'rows-reordered'是* not *发送,即使它看起来像从GUI重新排序。相反,在拖放期间,“行删除”和“行插入”信号被发射。 – doublep 2010-05-15 18:13:56

+0

这是我需要知道的,谢谢。 – mkotechno 2010-05-16 04:00:10

0

我也有这个问题,文档不清楚。但这里是我的发现,当你有

tvcolumn.set_sort_column_id(0) 

但是你仍然绑定信号的TreeModel

“行重新排序”信号发出。

treestore = gtk.TreeStore(str, object) 
treestore.connect("rows-reordered", self.rows_r) 

这将导致可见列标题变为可点击。当你点击列标题时,它会按升序重新排序树中的项目,然后按降序排列,如果再次点击它,并来回。

这里有一个简单的代码,你可以测试,看看我的意思。

import pygtk 
pygtk.require('2.0') 
import gtk 

class BasicTreeViewExample: 

    def __init__(self): 
     window = gtk.Window(gtk.WINDOW_TOPLEVEL) 
     window.set_title("Treeview") 
     window.set_size_request(200, 200) 
     window.connect("destroy", lambda w: gtk.main_quit()) 

     treestore = gtk.TreeStore(str) 
     treestore.connect("rows-reordered", self.rows_reordered) 

     for i in range(4): 
      piter = treestore.append(None, ['Item %i' % i]) 

     treeview = gtk.TreeView(treestore) 

     tvcolumn = gtk.TreeViewColumn('Click Me!') 

     treeview.append_column(tvcolumn) 

     cell = gtk.CellRendererText() 

     tvcolumn.pack_start(cell, True) 

     tvcolumn.add_attribute(cell, 'text', 0) 

     # This allows the column header ("Click me!") to be clickable and sort/order items 
     tvcolumn.set_sort_column_id(0) 

     window.add(treeview) 
     window.show_all() 


    def rows_reordered(self, a, b, c, d): 
     print a 
     print b 
     print c 
     print d 


def main(): 
    gtk.main() 

if __name__ == "__main__": 
    tvexample = BasicTreeViewExample() 
    main()