Julia Gtk开发中如何取消列表已处理选中行的选中状态
实现方法
直接在选中行触发的打印逻辑执行完之后,调用选中对象的取消选中方法清除当前行选中状态就行。原示例里打印年龄的时候取错了列,顺手修正了——原代码取的是索引1的姓名列,年龄实际存在索引2的位置。
取消选中的时候不需要额外加防重复触发的标记,因为取消选中触发changed信号时,hasselection(selection)会返回false,不会重复跑打印逻辑,不会出现死循环。
修改后完整代码
using Gtk ls = GtkListStore(String, Int, Bool) push!(ls,("Peter",20,false)) push!(ls,("Paul",30,false)) push!(ls,("Mary",25,true)) tv = GtkTreeView(GtkTreeModel(ls)) rTxt = GtkCellRendererText() rTog = GtkCellRendererToggle() c1 = GtkTreeViewColumn("Name", rTxt, Dict([("text",0)])) c2 = GtkTreeViewColumn("Age", rTxt, Dict([("text",1)])) c3 = GtkTreeViewColumn("Female", rTog, Dict([("active",2)])) push!(tv, c1, c2, c3) win = GtkWindow(tv, "List View") showall(win) selection = GAccessor.selection(tv) signal_connect(selection, "changed") do widget if hasselection(selection) currentIt = selected(selection) # 执行选中后的业务逻辑:打印行信息 println("Name: ", ls[currentIt,1], " Age: ", ls[currentIt,2]) # 业务处理完取消当前行选中 unselect!(selection, currentIt) end end
补充说明
- 上面用的
unselect!(selection, currentIt)是精准取消当前选中的单行,如果你的列表开了多选模式,要清空所有选中状态,直接换成unselectall!(selection)即可 - 如果你后续在取消选中前加了其他异步逻辑,担心信号重复触发,可以在取消选中前临时用
signal_handler_block阻塞信号,处理完再恢复,但常规同步场景下完全不需要这一步
内容的提问来源于stack exchange,提问作者Sasha
相关产品推荐
相关产品推荐

