2017-02-27 11 views
1

ウィジェットを破棄してGtk.FlowBoxからウィジェットを削除しようとしていますが、グレーボックスが残っています。どのように私は灰色のボックスを削除することができますので、隣接するウィジェットは、ウィジェットの削除後に場所に落ちるように考えています。 1- 2つの画像を(PIXBUFから)とラベル 2-オーバーレイ画像がFlowBoxGtk.FlowBoxからウィジェットを削除する

に追加されるイベントボックス 3-イベントボックスに追加されOverlayImageに添加される:

は、以下のウィジェットがパックされる方法であります

は、私は次の方法を試してみました: の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を質問に追加して、同じ問題を抱えている人を助ける場合に備えてください。私がしなかった恥はドキュメントを正しく読んだ。再度、感謝します ! –

関連する問題