2014-07-25 75 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()