派生ウィジットを使う

Gladeを使って、gtkmmのウィジットクラスから派生した自作のウィジットを配置することができます。これはコードをまとまったものにし、カプセル化を可能にします。もちろん派生したウィジットの正確な外見やプロパティをGladeで見ることはできませんが、位置や子ウィジット、基底gtkmmクラスのプロパティは指定することができます。

Glade::Xml::get_widget_derived()をこのように使ってください:

DerivedDialog* pDialog = 0;
refXml->get_widget_derived("DialogBasic", pDialog);

派生クラスはコンスタラクタを持ち、基礎にあるCの型と、Gnome::Glade::Xmlのインスタンスへのポインタを引数にとらなければいけません。gtkmmの全てのクラスは基礎にあるCの型、BaseObjectTypeのtypedefになっています(例えば、Gtk::DialogBaseObjectTypeGtkDialogへtypedefしています)。

初期化リストのなかで基底クラスのコンストラクタをCポインタとともに呼び出してください。このようになります:

DerivedDialog::DerivedDialog(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& refGlade)
: Gtk::Dialog(cobject)
{
}

さらに、派生ウィジットのコンストラクタのなかで、子ウィジットの操作をカプセル化して行うこともできます。おそらくget_widget()get_widget_derived()を再び使うことになるでしょう。このように:

DerivedDialog::DerivedDialog(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& refGlade)
: Gtk::Dialog(cobject),
  m_refGlade(refGlade),
  m_pButton(0)
{
  //Get the Glade-instantiated Button, and connect a signal handler:
  m_refGlade->get_widget("quit_button", m_pButton);
  if(m_pButton)
  {
    m_pButton->signal_clicked().connect( sigc::mem_fun(*this, &DerivedDialog::on_button_quit) );
  }
}

derivedのコード例がlibglademmパッケージの中にあり、そこでどのようにGladeファイルを実行時に読み込んで派生クラスからウィジットにアクセスする方法を紹介しています。