bst*_*rre 8 gtk glade widget gtkmm
我正在使用gtkmm编写自定义小部件,但我无法让它在林间空地中工作.(小部件本身几乎没有功能;它确实有效,我希望在进入下一步之前让它在林间空地工作.)Glade找到小部件,但是当我尝试将它放在窗口中时,林间空地崩溃.
根据我在各种搜索过程中发现的提示,我将这段代码添加到主源文件中:
extern "C"
{
GType date_chooser_get_type(void)
{
return DateChooser::get_type();
}
}
Run Code Online (Sandbox Code Playgroud)
我怀疑上面的代码是不对的,但是我找不到关于这个函数应该做什么的任何gtkmm或glade文档.
<?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>
Run Code Online (Sandbox Code Playgroud)
这是我的widget源代码目录的根目录gtk-date-chooser.xml.我使用以下命令在该目录中运行glade:
GLADE_CATALOG_SEARCH_PATH=. GLADE_MODULE_SEARCH_PATH=./.libs glade
Run Code Online (Sandbox Code Playgroud)
当窗口出现时,我的窗口小部件将显示在目录中指定的特殊"日期"组中,并带有默认图标.如果我放置一个窗口,然后在窗口中选择要放置的小部件,则会发生崩溃.我在控制台上看到以下内容:
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
Run Code Online (Sandbox Code Playgroud)
看起来这个(未答复的)问题的答案可能提供了一个线索,但我无法找到任何有关该问题的答案或有助于解决我的问题的线索.
我正在使用的版本:
(我愿意根据主干版本或Centos 6或Fedora 16测试解决方案.)
以下是向Glade添加自定义gtkmm小部件所必需的:
最重要的是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);
}
Run Code Online (Sandbox Code Playgroud)
您应该非常仔细地编写目录文件.名称必须正确(特别是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>
Run Code Online (Sandbox Code Playgroud)
没有什么可做,但实现了函数,它将我们的小部件注册为Glade库初始化的一部分.
extern "C" void
custom_widgets_glade_init ()
{
Gtk::Main::init_gtkmm_internals ();
custom_widgets_register ();
}
Run Code Online (Sandbox Code Playgroud)
初始化gtkmm内部是必须的,因为 custom_widgets_glade_init是从Glade调用的,它是用C语言而不是用C++编写的,所以它只初始化GTK +.
如果您对该主题感兴趣,可以在此处找到我的博客文章,了解更多详情.
| 归档时间: |
|
| 查看次数: |
2478 次 |
| 最近记录: |