我正在創建一個新的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::Widget
到append_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
作爲新的父母,那麼新標籤會顯示所有正確排列的小部件,但是我無法控制標籤的標題。
必須有一個'正確'的方法來做到這一點,我只是無法弄清楚它是什麼!
也許創建多個Builder對象並將XML文件加載到每個對象中?這將創建小部件的多個副本。 – cdhowie
@cdhowie:我已經更新了這個問題,謝謝。 – Malvineous