【发布时间】:2015-01-02 04:54:54
【问题描述】:
我正在创建一个新的 GTK 应用程序(使用 gtkmm),主界面是标签式的,有点像网络浏览器。
我想为用户打开的每个文档创建一个新选项卡,每个选项卡的内容由 Glade 定义。我是 gtkmm 的新手,所以我不知道该怎么做。
如果我将 Glade 中的选项卡设计为独立窗口,当我调用 Gtk::Builder::get_widget() 时,它会返回一个指向 Gtk::Window 的指针,但我无法将其传递给 Gtk::Notebook::append_page(),因为该函数需要引用我只有一个指针。我不想取消引用指针,因为我相信每次调用 get_widget() 都会返回相同的指针 - 所以如果我想添加相同的五个页面,我需要以某种方式克隆 UI 结构,然后再将其添加到 @987654325 @ - 否则更改一个选项卡上的 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)
1234563控制标签的标题。
必须有一个“正确”的方法来做到这一点,我就是不知道它是什么!
【问题讨论】:
-
也许创建多个 Builder 对象并将 XML 文件加载到每个对象中?这将创建小部件的多个副本。
-
@cdhowie:我已经更新了问题作为回应,谢谢。