从 Glade 文件构建时,Gtkmm 自定义小部件会引发错误

Posted

技术标签:

【中文标题】从 Glade 文件构建时,Gtkmm 自定义小部件会引发错误【英文标题】:Gtkmm Custom Widget throws error when building from Glade file 【发布时间】:2021-03-16 22:20:15 【问题描述】:

我已经制作了一个自定义小部件,并且由于缺乏文档来获得扩展 Gtk::Entry 的自定义对象,因此整个下午都在苦苦挣扎。我已经到了可以在 Glade 中添加小部件的地步。我现在收到一个错误:

terminate called after throwing an instance of 'Gtk::BuilderError'

加载时。我的 gdb 技能不是很好,但我知道错误是从 auto builder = Gtk::Builder::create_from_file("glade/window_main.glade"); 抛出的

这是我的自定义对象实现的样子:

...

IntEntry::IntEntry(GtkEntry *gobj) : Gtk::Entry(gobj)




IntEntry::IntEntry() : Glib::ObjectBase("intentry")



void IntEntry::set_value(int value)

  this->value = value;
  this->set_text(std::to_string(value));


void IntEntry::on_insert_text(const Glib::ustring &text, int *position)

  if (is_int(text))
  
    Gtk::Entry::on_insert_text(text, position);
    auto full_text = this->get_text();
    std::string str_text = full_text.c_str();
    this->set_value(std::stoi(str_text));
  else
    Gtk::Entry::on_insert_text(text, position);
  


Glib::ObjectBase *
IntEntry::wrap_new(GObject *o)

  if (gtk_widget_is_toplevel(GTK_WIDGET(o)))
  
    return new IntEntry(GTK_ENTRY(o));
  
  else
  
    return Gtk::manage(new IntEntry(GTK_ENTRY(o)));
  


void IntEntry::register_type()

  if (gtype)
    return;

  IntEntry dummy;

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

  gtype = G_OBJECT_TYPE(widget);
  
  Glib::wrap_register(gtype, IntEntry::wrap_new);



extern "C" void custom_widgets_init()

  Gtk::Main::init_gtkmm_internals();
  IntEntry::register_type();

这主要改编自一个网站上的博客文章,该网站不再存在,但可以找到存档here。

我的目录如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<glade-catalog name="customwidgets" library="customwidgetsglade" depends="gtk+">

  <init-function>custom_widgets_init</init-function>

  <glade-widget-classes>
    <glade-widget-class name="gtkmm__CustomObject_intentry" generic-name="intentry" icon-name="widget-gtk-entry" title="Int Entry">
    </glade-widget-class>
  </glade-widget-classes>

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

</glade-catalog>

【问题讨论】:

【参考方案1】:

事实证明,在写问题的过程中,我发现了我的问题。

我在尝试使用自定义对象之前忘记注册它们。

在拨打Gtk::Builder::create_from_file("glade/window_main.glade");之前,我需要先拨打custom_widgets_init()

【讨论】:

以上是关于从 Glade 文件构建时,Gtkmm 自定义小部件会引发错误的主要内容,如果未能解决你的问题,请参考以下文章

带有 gtkmm 的 Glade 构建的 TreeView

gtkmm & glade - 多个窗口不工作

使用 Glade 和 gtkmm 对 GTK+ 对象进行内存管理

关于 glade3 和 gtkmm 的 Linux / C++ 帮助

gtkmm 应用程序内存使用量不断增加

使用 gtkmm 编译 gtk 程序时出错