1

我有一个简单gtk.TreeViewgtk.ListStore模型set_reorderable(True),我想捕捉用户通过拖放列表重新排序时发出的信号/事件,但文档并没有太大帮助:

“应用程序可以通过连接到模型的信号来监听这些变化”

所以我尝试连接模型(ListStore)信号......但惊喜!ListStore 没有信号,因此您被分派到 TreeModel 信号,然后我尝试连接 TreeModel “rows-reordered”信号,但没有运气。

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

4

2 回答 2

3

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

于 2010-05-14T16:32:43.420 回答
0

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

'rows-reordered' 信号在你有时发出

tvcolumn.set_sort_column_id(0)

但是,您仍然将信号绑定到树模型。

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()
于 2010-11-26T06:34:01.680 回答