Как я могу динамически обновлять Gtk.ListBox?
Итак, у меня есть список:
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) ", это показывает, что в списке есть что-то, поэтому что-то происходит, но список в графическом интерфейсе не обновляется.
Полный код здесь, если необходимо: http://pastebin.com/u/Levike
5 ответов
В других языках, использующих gtk, я бы сделал l.show(), чтобы убедиться, что элемент становится видимым. Возможно, то же самое здесь?
Лично я бы предположил, что Gtk.ListBoxRow похож на iter в Gtk.TreeModel, хотя это 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).
Если вы не хотите этого, я не думаю, что вы должны использовать его или нет до следующего выпуска.
Меня устраивает. В любом случае, да, используйте Gtk.TreeView с 5 столбцами. 4 из них используют Gtk.CellRendererText, а 1 из них использует Gtk.CellRendererPixbuf. Создайте модель ListStore и получите ее оттуда, чтобы вы могли в любое время изменить содержимое списка и просто обновить его, вызвав set_model. И, кстати, установив для свойства Gtk.TreeView "заголовки-видимые" значение False, и вуаля, вы получите разметку Gtk.ListBox
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()