首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GtkTreeView过滤和选择

GtkTreeView过滤和选择
EN

Stack Overflow用户
提问于 2015-06-15 19:36:42
回答 1查看 708关注 0票数 1

我有一个简单的GtkTreeView和一个用于过滤模型的GtkEntry。当我在条目中键入内容时,software_list会按语言进行过滤。

代码语言:javascript
运行
复制
software_list = [("Firefox", 2002,  "C++"),
                 ("Eclipse", 2004, "Java" ),
                 ("Netbeans", 1996, "Java"),
                 ("Chrome", 2008, "C++"),
                 ("GCC", 1987, "C"),
                 ("Frostwire", 2004, "Java")]

class TreeViewFilterWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self)
        self.curr_filter = ''

        self.entry = Gtk.Entry()
        self.entry.connect('changed', self.on_text_change)

        self.software_liststore = Gtk.ListStore(str, int, str)
        for software_ref in software_list:
            self.software_liststore.append(list(software_ref))

        self.filter = self.software_liststore.filter_new()
        self.filter.set_visible_func(self.filter_func)

        self.treeview = Gtk.TreeView.new_with_model(self.filter)
        for i, column_title in enumerate(["Software", "Release Year", "Programming Language"]):
            renderer = Gtk.CellRendererText()
            column = Gtk.TreeViewColumn(column_title, renderer, text=i)
            self.treeview.append_column(column)
        self.treeview.get_selection().connect('changed', self.on_row_select) 

        # packing into boxes, showing components, starting main loop goes here

    def on_text_change(self, entry):
        self.curr_filter = entry.get_text()
        self.filter.refilter()

    def filter_func(self, model, iter, data):
        if self.curr_filter:
            return re.search(re.escape(self.curr_filter), model[iter][2])
        else:
            return True

问题是,当我选择“即”时。从列表中选择"Chrome“,然后在条目中键入"Java”,很明显,"Chrome“将被隐藏,但选择将更改为其他随机行。我更喜欢TreeView未选中的隐藏元素,而不是更改选择。我该怎么做呢?

EN

回答 1

Stack Overflow用户

发布于 2016-10-23 15:17:33

这在Gtk2中可以正常工作,但在Gtk3中,如果该行消失,则需要取消选择该行。适当的代码是

代码语言:javascript
运行
复制
class TreeViewFilterWindow(Gtk.Window):

    def __init__(...):
        ...
        self.selection = self.treeview.get_selection()
        self.filter.connect('row-deleted', self.on_row_deleted)

    def on_row_deleted(self, model, path):
        if self.selection.path_is_selected(path):
            GObject.idle_add(self.selection.unselect_path, path)

我发现由于某种原因,直接调用self.selection.unselect_path(path)似乎行不通,但是用idle_add延迟调用就解决了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30844180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档