You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 08:24:21