Как я могу динамически обновлять 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 ответов

Решение

listbox.show_all() исправляет мою проблему.

В других языках, использующих 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()
Другие вопросы по тегам