Använda härledda komponenter
You can use Gtk::Builder and Glade to layout your own custom widgets derived from gtkmm widget classes. This keeps your code organized and encapsulated, separating declarative presentation from business logic, avoiding having most of your source just be setting properties and packing in containers.
Use Gtk::Builder::get_widget_derived() like so:
auto pDialog = Gtk::Builder::get_widget_derived<DerivedDialog>(builder, "DialogDerived");
Your derived class must have a constructor that takes a pointer to the underlying C type, and the Gtk::Builder instance. All relevant classes of gtkmm typedef their underlying C type as BaseObjectType (Gtk::Window typedefs BaseObjectType as GtkWindow, for instance).
Du måste anropa basklassens konstruktor i initieringslistan och tillhandahålla C-pekaren. Till exempel,
DerivedDialog::DerivedDialog(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
: Gtk::Window(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<Gtk::Builder>& builder)
: Gtk::Window(cobject),
m_builder(builder),
//Get the Glade-instantiated Button, and connect a signal handler:
m_pButton(m_builder->get_widget<Gtk::Button>("quit_button"))
{
if (m_pButton)
{
m_pButton->signal_clicked().connect( sigc::mem_fun(*this, &DerivedDialog::on_button_quit) );
}
}
Det är möjligt att skicka ytterligare argument från get_widget_derived() till konstruktorn för den härledda komponenten. Exempelvis kan detta anrop till get_widget_derived()
auto pDialog = Gtk::Builder::get_widget_derived<DerivedDialog>(builder, "DialogDerived", true);
DerivedDialog::DerivedDialog(BaseObjectType* cobject,
const Glib::RefPtr<Gtk::Builder>& builder, bool warning)
: Gtk::Window(cobject),
m_builder(builder),
m_pButton(m_builder->get_widget<Gtk::Button>("quit_button"))
{
// ....
}
Gtk::Builder och Glib::Property
If your derived widget uses Glib::Property, it becomes slightly more complicated. A derived widget that contains Glib::Property members must be registered with its own name in the GType system. It must be registered before any of the create_from_*() or add_from_*() methods are called, meaning that you may have to create an instance of your derived widget just to have its class registered. Your derived widget must have a constructor that has the parameters required by get_widget_derived() and calls the Glib::ObjectBase constructor to register the GType.
DerivedButton::DerivedButton(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
: Glib::ObjectBase("MyButton"), // The GType name will be gtkmm__CustomObject_MyButton.
Gtk::Button(cobject),
prop_ustring(*this, "button-ustring"),
prop_int(*this, "button-int", 10)
{
// ....
}
När gtkmm används med en version av glibmm som är 2.62 och högre är det även möjligt att ange egenskaper för härledda komponenter, deklarerade i C++ med gtkmm, i .glade-filer och läsa in/sätta dessa med Gtk::Builder. Se dokumentationen för Gtk::Builder för mer detaljer om hur detta kan uppnås. Glade kommer inte känna igen sådana egenskaper som de är, men bör kunna göra det genom användning av egenskapsklassdefinitioner och en katalog som deklarerar dessa nya egenskaper.
Exempel
Detta exempel visar hur du läser in en Glade-fil vid körning och kommer åt komponenterna genom härledda klasser.