gpt4 book ai didi

gtk - 如何将自定义gtkmm小部件添加到林间空地?

转载 作者:行者123 更新时间:2023-12-04 08:27:59 24 4
gpt4 key购买 nike

我正在写custom widget using gtkmm,但无法在沼气中使用它。 (该窗口小部件本身几乎不起作用;它确实可以工作,在继续下一步之前,我想让它在林间中工作。)Glade找到了该窗口小部件,但是当我尝试将其放置在窗口中时,林间空地崩溃。

根据在各种搜索中发现的提示,我将以下代码添加到了主源文件中:

extern "C"
{
GType date_chooser_get_type(void)
{
return DateChooser::get_type();
}
}

我怀疑上面的代码是不正确的,但是我找不到任何有关此功能应该做什么的gtkmm或Glade文档。

基于 catalog documentation for glade,我创建了以下XML:
<?xml version="1.0" encoding="UTF-8"?>
<glade-catalog name="gtk-date-chooser" library="libgtkdatechooser-0.1.so" language="c++">
<glade-widget-classes>
<glade-widget-class name="DateChooser" generic-name="date-chooser" title="Date Chooser" />
</glade-widget-classes>
<glade-widget-group name="date" title="Date">
<glade-widget-class-ref name="DateChooser"/>
</glade-widget-group>
</glade-catalog>

这位于小部件的源目录的根目录中,名称为 gtk-date-chooser.xml。我使用以下命令在该目录中运行林间空地:
GLADE_CATALOG_SEARCH_PATH=. GLADE_MODULE_SEARCH_PATH=./.libs glade

出现窗口时,我的窗口小部件将出现在目录中指定的特殊“日期”组中,并带有默认图标。如果放置一个窗口,然后选择要在窗口中放置的小部件,则空地崩溃。我在控制台上看到以下内容:
GladeUI-Message: 2 missing displayable value for GtkWidget::events
GladeUI-Message: No displayable values for property GtkTreeSelection::mode
GladeUI-Message: 1 missing displayable value for GtkCellRendererAccel::accel-mode
GladeUI-Message: 14 missing displayable value for GtkCellRendererAccel::accel-mods

(glade:23757): GladeUI-CRITICAL **: gwa_list_signals: assertion `real_type != 0' failed

(glade:23757): GLib-GObject-WARNING **: cannot retrieve class for invalid (unclassed) type `<invalid>'

(glade:23757): GLib-GObject-CRITICAL **: g_object_class_list_properties: assertion `G_IS_OBJECT_CLASS (class)' failed

(glade:23757): GLib-GObject-WARNING **: cannot retrieve class for invalid (unclassed) type `<invalid>'

(glade:23757): Gtk-CRITICAL **: gtk_container_class_list_child_properties: assertion `GTK_IS_CONTAINER_CLASS (cclass)' failed
GladeUI-Message: Glade needs artwork; a default icon will be used for the following classes:
DateChooser needs an icon named 'widget-gtk-date-chooser-date-chooser'
**
GladeUI:ERROR:glade-signal-model.c:800:glade_signal_model_iter_n_children: code should not be reached

似乎对 this (unanswered) question的答案可能提供了一个线索,但是我一直无法找到该问题的任何答案或对我的问题有所帮助的线索。

我使用的版本:
  • Ubuntu:12.04
  • gtkmm:3.4.0-0ubuntu1
  • 林间空地:3.12.0-0ubuntu1

  • (我愿意基于主干版本或Centos 6或Fedora 16测试解决方案。)

    最佳答案

    要向Glade添加自定义gtkmm小部件,需要执行以下操作:

  • 至少一个纯自定义小部件实现
  • 自定义小部件
  • 的一些Glade相关的额外功能
  • 一个目录文件,描述了Glade的自定义小部件
  • 一个库包含自定义小部件以及一些与Glade相关的
    函数

  • 最重要的事实是Glade是用C而不是C++编写的,因此我们必须能够将计划C小部件包装到C++,并且必须将此包装功能注册到与自定义小部件相关的 GType。它看起来像以下内容:
    #include "custom_widget.h"

    GType CustomWidget::gtype = 0;

    CustomWidget::CustomWidget (GtkEntry *gobj) :
    Gtk::Entry (gobj)
    {
    }

    CustomWidget::CustomWidget () :
    Glib::ObjectBase ("customwidget")
    {
    }

    Glib::ObjectBase *
    CustomWidget::wrap_new (GObject *o)
    {
    if (gtk_widget_is_toplevel (GTK_WIDGET (o)))
    {
    return new CustomWidget (GTK_ENTRY (o));
    }
    else
    {
    return Gtk::manage(new CustomWidget (GTK_ENTRY (o)));
    }
    }

    void
    CustomWidget::register_type ()
    {
    if (gtype)
    return;

    CustomWidget dummy;

    GtkWidget *widget = GTK_WIDGET (dummy.gobj ());

    gtype = G_OBJECT_TYPE (widget);

    Glib::wrap_register (gtype, CustomWidget::wrap_new);
    }

    您应该非常仔细地编写目录文件。名称必须正确(尤其是 glade-widget-class)才能正常工作。
    <?xml version="1.0" encoding="UTF-8" ?>
    <glade-catalog name="customwidgets" library="customwidgetsglade" depends="gtk+">

    <init-function>custom_widgets_glade_init</init-function>

    <glade-widget-classes>
    <glade-widget-class name="gtkmm__CustomObject_customwidget" generic-name="customwidget" icon-name="widget-gtk-entry" title="Custom Widget">
    </glade-widget-class>
    </glade-widget-classes>

    <glade-widget-group name="customwidgets" title="Custom Widgets" >
    <glade-widget-class-ref name="gtkmm__CustomObject_customwidget" />
    </glade-widget-group>

    </glade-catalog>

    除了执行该功能外,无需执行任何操作,该功能将我们的小部件注册为Glade库初始化的一部分。
    extern "C" void
    custom_widgets_glade_init ()
    {
    Gtk::Main::init_gtkmm_internals ();
    custom_widgets_register ();
    }

    必须初始化gtkmm内部,因为 custom_widgets_glade_init是从Glade调用的,而Glade是用C语言编写的,而不是用C++语言编写的,因此只能初始化GTK +。

    如果您对该主题感兴趣,可以在我的博客文章 here中找到更多详细信息。

    关于gtk - 如何将自定义gtkmm小部件添加到林间空地?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10826435/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com