2017-02-27 24 views
1

我試圖通過銷燬小部件從Gtk.FlowBox中移除一個小部件,但是還有一個灰色框留在原地。任何想法如何刪除灰色框,以便相鄰的小部件在刪除小部件後落入適當位置。從Gtk.FlowBox中移除小部件

以下是如何窗口小部件包裝: 1-兩個圖像(來自PIXBUF)和標籤被添加到窗格在overlayImage 2-疊印圖像被添加到事件盒 3-事件盒被添加到FlowBox

我曾嘗試以下方法:1 摧毀事件盒 2-獲取和破壞疊加圖像的所有兒童,然後摧毀覆蓋圖像和事件盒

在這兩種情況下,小部件被刪除,但一個空白區域停留在點擊時灰色的地方,但什麼都不做 - 看圖片。

如何刪除此空白空間,以便下一個小部件自動落入小部件已移除的位置,並且下一個小部件落入其位置等等。

的代碼可以在這裏和「removeSelectedBooksFromLibrary」是被去除事件盒通過從FlowBox

此用戶選擇是從FlowBox添加部件 https://github.com/babluboy/bookworm/blob/master/src/bookworm.vala#L589

此代碼中的方法是代碼從FlowBox刪除部件 https://github.com/babluboy/bookworm/blob/master/src/bookworm.vala#L512

enter image description here 預先感謝

下面是添加解決方案的一個工作示例,它將刪除小部件及其父項。

public class FlowBoxIssue : Gtk.Window { 

    public static int main (string[] args) { 
     Gtk.init (ref args); 
     FlowBoxIssue window = new FlowBoxIssue(); 
     window.show_all(); 
     Gtk.main(); 
     return 0; 
    } 

    public FlowBoxIssue() { 
     this.title = "FlowBox Issue"; 
     this.window_position = Gtk.WindowPosition.CENTER; 
     this.destroy.connect (Gtk.main_quit); 
     this.set_default_size (800, 600); 

     Gtk.FlowBox library_flowbox = new Gtk.FlowBox(); 
     Gtk.Box library_mainbox = new Gtk.Box (Gtk.Orientation.VERTICAL, 20); 

     Gtk.ScrolledWindow library_scroll = new Gtk.ScrolledWindow (null, null); 
      library_scroll.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); 
      library_scroll.add (library_flowbox); 

     Gtk.Overlay aOverlayImage1 = new Gtk.Overlay(); 
     Gtk.EventBox aEventBox1 = new Gtk.EventBox(); 
     Gtk.EventBox aEventBox2 = new Gtk.EventBox(); 
     Gtk.EventBox aEventBox3 = new Gtk.EventBox(); 
     try{ 
     Gdk.Pixbuf aBookCover1 = new Gdk.Pixbuf.from_file_at_scale("cover.png", 200, 250, false); 
     Gtk.Image aCoverImage1 = new Gtk.Image.from_pixbuf(aBookCover1); 

     aOverlayImage1.add(aCoverImage1); 
     Gtk.Label overlayTextLabel1 = new Gtk.Label("Label 1"); 
     aOverlayImage1.add_overlay(overlayTextLabel1); 
     aEventBox1.add(aOverlayImage1); 
     library_flowbox.add (aEventBox1); 
     }catch(Error e){ 

     } 

     Gtk.Overlay aOverlayImage2 = new Gtk.Overlay(); 
     try{ 
     Gdk.Pixbuf aBookCover2 = new Gdk.Pixbuf.from_file_at_scale("cover.png", 200, 250, false); 
     Gtk.Image aCoverImage2 = new Gtk.Image.from_pixbuf(aBookCover2); 

     aOverlayImage2.add(aCoverImage2); 
     Gtk.Label overlayTextLabel2 = new Gtk.Label("Label 2"); 
     aOverlayImage2.add_overlay(overlayTextLabel2); 
     aEventBox2.add(aOverlayImage2); 
     library_flowbox.add (aEventBox2); 
     }catch(Error e){ 

     } 

     Gtk.Overlay aOverlayImage3 = new Gtk.Overlay(); 
     try{ 
     Gdk.Pixbuf aBookCover3 = new Gdk.Pixbuf.from_file_at_scale("cover.png", 200, 250, false); 
     Gtk.Image aCoverImage3 = new Gtk.Image.from_pixbuf(aBookCover3); 

     aOverlayImage3.add(aCoverImage3); 
     Gtk.Label overlayTextLabel3 = new Gtk.Label("Label 3"); 
     aOverlayImage3.add_overlay(overlayTextLabel3); 
     aEventBox3.add(aOverlayImage3); 
     library_flowbox.add (aEventBox3); 
     }catch(Error e){ 

     } 

     Gtk.Button delete_button = new Gtk.Button.with_label("Delete Pix"); 
     delete_button.clicked.connect (() => { 
      //This is the line which resolved the issue - get the parent of the widget and destroy it and then destroy the widget 
      aEventBox2.get_parent().destroy(); 
       aEventBox2.destroy(); 
      }); 

     library_mainbox.pack_start(library_scroll, true, true, 0); 
     library_mainbox.pack_end(delete_button, true, false, 0); 
     this.add(library_mainbox); 
    } 

} 
+0

您忘記了鏈接代碼(在問題本身中應該確實是[MCVE](http://stackoverflow.com/help/mcve))。 – andlabs

+0

忘記提及代碼的道歉。我將嘗試創建一個MCVE並更新問題 –

回答

4

你添加一個子窗口小部件,GtkFlowBox每次,流漿箱部件將在兩者之間添加一個隱含的子部件,事件處理和造型的目的 - 作爲文檔GtkFlowBox狀態:

儘管GtkFlowBox必須只有GtkFlowBoxChild子元素,但您可以通過gtk_container_add()向其添加任何類型的構件,並且GtkFlowBoxChild構件將自動插入到構件和構件之間。

這意味着該行:

library_grid.add(aEventBox); 

是真的等同於:

var flowbox_child = new Gtk.FlowBoxChild(); 
flowbox_child.add(aEventBox); 
library_grid.add(flowbox_child); 

如果你想從GtkFlowBox刪除一個小部件,你只保留給孩子一個參考您添加了,您需要檢索其父項並從GtkFlowBox刪除:

aEventBox.get_parent().destroy(); 
// or 
library_grid.remove(aEventBox.get_parent()); 
+0

非常感謝您的快速和非常明確的迴應。該解決方案在我的主代碼和我正在創建的MVCE中工作。我已經將MVCE添加到了這個問題中,以防止有人遇到同樣的問題。恥辱,我沒有正確閱讀文件。再次感謝 ! –