【问题标题】:How can I update Gtk.ListBox dynamically?如何动态更新 Gtk.ListBox?
【发布时间】:2014-07-25 08:19:48
【问题描述】:

所以我有一个列表框:

var listbox = new Gtk.ListBox();

var l = new Watcher.ListItem.NewItem("title","subtitle", "etc");
listbox.insert(l, 0);

“l”基本上是一个带有格式化标签和东西的Gtk.ListBoxRow

我添加了一个带有“新建”标签的按钮,其目的是将新项目添加到列表框中。

int i = 1;
back_new.clicked.connect( ()=>{
    l = new Watcher.ListItem.NewItem("title2", "subtitle2", "etc2");
    listbox.insert(l, i);
    i++;
});

问题是,如果我检查“listbox.get_row_at_index(2)”,它表明列表框中有一些东西,所以会发生一些事情,但 gui 中的列表框没有更新。

如果需要,这里有完整的代码: http://pastebin.com/u/Levike

【问题讨论】:

  • 请包含创建 ListBoxRow 和其中的小部件的代码。我的猜测仍然是其中一些是不可见的(不幸的是,GTK+ 默认对所有新小部件都不可见)。
  • 插入第一个元素(索引:0)是可以的。因此,如果我运行程序,我可以看到一个元素,但是当我单击“back_new”按钮时,它不会添加第二个元素。(我的意思是它不会出现)。我什至尝试创建一个只有一个标签的简单 listboxrow 元素。没有运气
  • 但这里是完整的代码:pastebin.com/u/Levike Listitem.vala 是你要求的@jku
  • 我没有看到我提到的代码。在任何情况下,问题都应该是独立的:请考虑在问题中添加small and self-contained 示例:您获得有用答案的机会将大大提高。
  • “不幸的是,GTK+ 默认对所有新小部件都不可见”。你能告诉我如何改变它以显示它们吗?抱歉,您看到了我以前的问题,而我对 vala 或列表框一无所知的朋友在没有我解释的情况下知道我的问题是什么。我不想发火或任何事情,感谢您的时间,但我不能更容易地问这个问题。阅读@luciomrx 的答案可能我有一个错误。它应该更新 gui,但由于某种原因它没有

标签: listbox gtk vala


【解决方案1】:

listbox.show_all() 解决了我的问题。

【讨论】:

    【解决方案2】:

    在使用 gtk 的其他语言中,我会执行 l.show() 以确保项目变得可见。 也许这里也一样?

    【讨论】:

    【解决方案3】:

    我个人认为 Gtk.ListBoxRow 就像 Gtk.TreeModel 中的 iter,即使它是一个 Gtk.Container。您可以跳过将小部件添加到 ListBoxRow(直接添加到 ListBox)中,无论您喜欢与否,它都会自动为您创建一个 ListBoxRow。也许这是一个错误(也许......),也许开发人员应该用 Gtk.ListBox 实现一个模型,但是现在,每次你想在 Gtk.ListBox 中附加一些东西时,只需使用 Gtk.Container.add ()。在您的代码中:

    int i = 1;
    back_new.clicked.connect( ()=>{
    l = new Watcher.ListItem.NewItem("title2", "subtitle2", "etc2");
    listbox.insert(l, i);
    i++;
    });
    # change to listbox.add (the widget...not the listboxrow widget) and it will show
    

    关于 Gtk.ListBox,它是一个容器,您可以在其中过滤和排序里面的子项,也可以更轻松地“填充”复杂列表的子项(Gtk.TreeView 仅使用 Gtk.CellRenderer )。

    如果你不想要,我认为你不应该使用它,或者直到下一个版本。

    【讨论】:

    • 也试过了。 listbox.add(new Gtk.Labe("asd"). ui 没有任何变化。你是在建议我应该使用 Gtk.TreeView 吗?我需要至少 4 个标签和一个列表项的图标。
    【解决方案4】:

    它对我有用。无论如何,是的,使用带有 5 列的 Gtk.TreeView。其中 4 个使用 Gtk.CellRendererText,其中 1 个使用 Gtk.CellRendererPixbuf。创建一个 ListStore 模型,然后从那里获取它,这样您就可以随时更改列表的包含,只需通过调用“set_model”来刷新它。顺便说一句,将 Gtk.TreeView 属性“headers-visible”设置为 False,瞧,你会得到一个标记 Gtk.ListBox

    【讨论】:

    • 太棒了,那是什么应用程序..顺便说一句,创建这样的模型需要一些修补..以前没有做过,但我相信可以做到..i将尝试编写草稿以尝试看起来像第一张图片
    • 我正在开发的应用程序 :) 没有名字,只是一个模型。帖子中有“完整”代码。一个指向 pastebin 的链接
    【解决方案5】:

    listbox.show_all() 也解决了我的问题。

    我的代码是:

    首先从列表框中删除所有项目:

    for row in self.gruppi_rows:
         self.listboxGrp.remove(row)
    

    然后将一些其他对象放入列表框中,如下所示,但列表框中没有显示内容:

         row = Gtk.ListBoxRow()
         self.count+=1
         cbutton=Gtk.CheckButton(name)
         flag1=self.radiobuttonSelectAll.get_active() 
         flag2=self.radiobuttonSelectNone.get_active() 
         box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
         cbutton.set_active(flag1)
         box.pack_start(cbutton, True, True, 0)
         row.add(box)
         self.listboxGrp.add(row)
    

    在末尾添加以下行可以解决问题:

         self.listboxGrp.show_all()
    

    【讨论】:

      猜你喜欢
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多