2015-01-02 60 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(),它将返回相同的控件实例。

相关问题