You can use Glade to layout your own custom widgets derived from gtkmm widget classes. This keeps your code organised and encapsulated. Of course you won't see the exact appearance and properties of your derived widget in Glade, but you can specify its location and child widgets and the properties of its gtkmm base class.
Use Glade::Xml::get_widget_derived()
like so:
DerivedDialog* pDialog = 0; refXml->get_widget_derived("DialogBasic", pDialog);
Your derived class must have a constructor that takes a pointer to the
underlying C type, and the Gnome::Glade::Xml
instance.
All relevant classes of gtkmm typedef their underlying C type as
BaseObjectType
(Gtk::Dialog
typedefs BaseObjectType
as GtkDialog, for instance).
You must call the base class's constructor in the initialization list, providing the C pointer. For instance,
DerivedDialog::DerivedDialog(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& refGlade) : Gtk::Dialog(cobject) { }
You could then encapsulate the manipulation of the child widgets in the
constructor of the derived class, maybe using get_widget()
or get_widget_derived()
again. For instance,
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) ); } }
This example shows how to load a Glade file at runtime and access the widgets via a derived class.
File: deriveddialog.h
#ifndef LIBGLADEMM_EXAMPLE_DERIVED_DIALOG_H #define LIBGLADEMM_EXAMPLE_DERIVED_DIALOG_H #include <gtkmm.h> #include <libglademm.h> class DerivedDialog : public Gtk::Dialog { public: DerivedDialog(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& refGlade); virtual ~DerivedDialog(); protected: //Signal handlers: virtual void on_button_quit(); Glib::RefPtr<Gnome::Glade::Xml> m_refGlade; Gtk::Button* m_pButton; }; #endif //LIBGLADEMM_EXAMPLE_DERIVED_WINDOW_H
File: main.cc
#include "deriveddialog.h" #include <iostream> int main (int argc, char **argv) { Gtk::Main kit(argc, argv); //Load the Glade file and instiate its widgets: Glib::RefPtr<Gnome::Glade::Xml> refXml; #ifdef GLIBMM_EXCEPTIONS_ENABLED try { refXml = Gnome::Glade::Xml::create("simple.glade"); } catch(const Gnome::Glade::XmlError& ex) { std::cerr << ex.what() << std::endl; return 1; } #else std::auto_ptr<Gnome::Glade::XmlError> error; refXml = Gnome::Glade::Xml::create("simple.glade", "", "", error); if(error.get()) { std::cerr << error->what() << std::endl; return 1; } #endif //Get the Glade-instantiated dialog:: DerivedDialog* pDialog = 0; refXml->get_widget_derived("DialogBasic", pDialog); if(pDialog) { //See the DerivedDialog constructor for more Glade::Xml stuff. //Start: kit.run(*pDialog); } delete pDialog; return 0; }
File: deriveddialog.cc
#include "deriveddialog.h" 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) ); } } DerivedDialog::~DerivedDialog() { } void DerivedDialog::on_button_quit() { hide(); //hide() will cause main::run() to end. }