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::DialogはBaseObjectTypeをGtkDialogへ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) );
}
}