2014-07-25 47 views
0

所以我有一个列表框:如何动态更新Gtk.ListBox?

var listbox = new Gtk.ListBox(); 

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

“L” 基本上是一个Gtk.ListBoxRow与格式化标签和东西。

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

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

+0

请包括创建ListBoxRow和其中的小部件的代码。我的猜测仍然是,其中一些不可见(GTK +不幸的是默认为不可见所有新的小部件)。 – jku

+0

插入第一个元素(索引:0)没问题。所以如果我运行程序,我可以看到一个元素,但是当我点击“back_new”按钮时,它不会添加第二个元素(我的意思是它不显示)。我甚至尝试用一个标签创建一个简单的listboxrow元素。没有运气 – Levi

+0

,但这里是完整的代码:http://pastebin.com/u/Levike Listitem.vala是你所要求的@jku – Levi

回答

4

listbox.show_all()修复了我的问题。

0

在其他语言中使用GTK,我会做一个l.show(),以确保该项目变得可见。 也许在这里呢?

+0

不起作用。有一个过滤器函数,但我不知道如何使用它。 http://references.valadoc.org/#!api=gtk+-3.0/Gtk.ListBox.set_filter_func 我甚至不知道它是否解决了我的问题。 – Levi

0

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

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

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

+0

也试过了。 listbox.add(new Gtk.Labe(“asd”)。在UI中没有任何改变。你是否建议我使用Gtk.TreeView?我至少需要4个标签和一个图标作为列表项。 – Levi

0

它适合我。无论如何,是的,使用5列Gtk.TreeView。其中4人使用Gtk.CellRendererText,其中1人使用Gtk.CellRendererPixbuf。创建一个ListStore模型,并从那里获取,以便随时更改列表的内容,只需调用“set_model”即可刷新它。顺便说一下,将Gtk.TreeView属性设置为“headers-visible”为False,并且瞧,你会得到一个标记Gtk.ListBox

+0

谢谢!我会尝试它 – Levi

+0

这是真棒,什么应用是..btw它需要一点修补创建这样的模型..以前没做过,但我相信它可以完成..我会尝试编码尝试的草稿看起来像第一张图片 – luciomrx

+0

我正在工作的应用程序:)没有它的名字tho,只是一个模型。这篇文章中有“完整”的代码。一个链接到pastebin – Levi

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