我正在创建一个新的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