2015-01-02 50 views
2

我正在創建一個新的GTK應用程序(使用gtkmm),主界面是選項卡式的,有點像網絡瀏覽器。如何在運行時從Glade定義添加Gtk :: Notebook選項卡?

我想爲用戶打開的每個文檔創建一個新選項卡,每個選項卡的內容由Glade定義。我是gtkmm的新手,所以我不知道如何做到這一點。

如果我格萊德設計我的標籤作爲一個獨立的窗口,當我打電話Gtk::Builder::get_widget()它返回一個指向Gtk::Window,但由於該功能需要一個參考我不能通過這Gtk::Notebook::append_page(),我只有一個指針。我不想取消引用指針,因爲我相信每次調用get_widget()都會返回相同的指針 - 所以如果我想添加五個相同的頁面,我需要以某種方式克隆UI結構,然後將其添加到Gtk::Notebook - 否則會更改一個選項卡上的UI元素也會導致它在其他四個選項卡上更改,因爲它們都指向相同的UI小部件。

在Glade中設計一個窗口並將其動態添加到Gtk::Notebook的最佳方式是什麼?


編輯:

將每個標籤的定義到一個單獨的文件*.glade確實讓我加載多個實例,以便部分都好。

但是我仍然無法加載的結構添加到Gtk::Notebook

  • 如果我告訴Gtk::Builder::get_widget().glade文件中檢索根Gtk::Window並添加爲新的標籤,它不會編譯因爲我必須通過Gtk::Widgetappend_page(),它不會接受Gtk::Window參數。
  • 如果我告訴它,而不是挑最頂層的窗口小部件,然後我得到了一堆的運行時錯誤:

    Can't set a parent on widget which has a parent 
    gtkcontainer.c:858: container class `gtkmm__GtkWindow' has no child property named `tab-expand' 
    gtkcontainer.c:858: container class `gtkmm__GtkWindow' has no child property named `tab-fill' 
    gtkcontainer.c:858: container class `gtkmm__GtkWindow' has no child property named `tab-label' 
    gtkcontainer.c:858: container class `gtkmm__GtkWindow' has no child property named `menu-label' 
    gtkcontainer.c:858: container class `gtkmm__GtkWindow' has no child property named `position' 
    Gtk:ERROR:gtkcontainer.c:3541:gtk_container_propagate_draw: assertion failed: (gtk_widget_get_parent (child) == GTK_WIDGET (container)) 
    Aborted (core dumped) 
    
  • 如果我把最上面的窗口小部件,而是叫reparent()並通過Gtk::Notebook作爲新的父母,那麼新標籤會顯示所有正確排列的小部件,但是我無法控制標籤的標題。

必須有一個'正確'的方法來做到這一點,我只是無法弄清楚它是什麼!

+0

也許創建多個Builder對象並將XML文件加載到每個對象中?這將創建小部件的多個副本。 – cdhowie

+0

@cdhowie:我已經更新了這個問題,謝謝。 – Malvineous

回答

1

感謝來自gtkmm郵件列表的幫助,我有解決方案。

在Glade中,我創建了一個Gtk::Window,其中包含一個Gtk::Box,並將所有控件都放在Box中。當試圖將Box作爲新選項卡添加時,這會引發問題,因爲Box已經有一個父項(Gtk::Window),所以嘗試使Gtk::Notebook成爲新的父項很麻煩。

相反,我發現你可以右鍵單擊Glade中的Gtk::Box按鈕,然後選擇「Add widget as topervel」。因此根本不需要Gtk::Window,並且由於Box沒有父母,所以撥打Gtk::Notebook::append_page()並通過Gtk::Box完美地工作。然後,我可以使用append_page()的變體,讓我可以同時設置標籤的標題。

但是,仍然需要創建一個新的Gtk::Builder實例來加載每個選項卡的控件,因爲每個選項卡都需要一個新的控件實例。如果您只是在同一個對象上繼續調用Gtk::Builder::get_widget(),它將返回相同的控件實例。

相關問題