所以我有一个列表框:
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
答案 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()