【问题标题】:How do you add Gtk::Notebook tabs at runtime from Glade definitions?如何在运行时从 Glade 定义中添加 Gtk::Notebook 选项卡?
【发布时间】: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:我已经更新了问题作为回应,谢谢。

标签: c++ tabs gtkmm glade


【解决方案1】:

感谢gtkmm 邮件列表的帮助,我有了解决方案。

在 Glade 中,我创建了一个 Gtk::Window,其中包含一个 Gtk::Box,并将我的所有控件放在 Box 中。这在尝试将 Box 添加为新选项卡时会导致问题,因为 Box 已经有一个父级(Gtk::Window),因此尝试将 Gtk::Notebook 设为新的父级很麻烦。

相反,我发现您可以在 Glade 中右键单击 Gtk::Box 的按钮,然后选择“将小部件添加为顶层”。然后根本不需要Gtk::Window,并且由于Box 没有父级,调用Gtk::Notebook::append_page() 并传递Gtk::Box 可以完美地工作。然后我可以使用append_page() 的变体,让我同时设置选项卡的标题。

但仍然需要创建一个新的Gtk::Builder 实例来加载每个选项卡的控件,因为每个选项卡都需要一个新的控件实例。如果你只是在同一个对象上继续调用Gtk::Builder::get_widget(),它会返回相同的控件实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多