如何动态更新Gtk.ListBox?

时间:2014-07-25 08:19:48

标签: listbox gtk vala

所以我有一个列表框:

var listbox = new Gtk.ListBox();

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

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

我添加了一个标签为“New”的按钮,其目的是将新项添加到ListBox中。

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

5 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我个人认为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)。

如果您不想这样,我认为您不应该使用它,或者直到下一次发布。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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()