Utilisation d'éléments graphiques dérivés

Vous pouvez utilisez Glade pour placer vos propres éléments graphiques personnalisés, dérivés à partir d'une classe d'élément graphique gtkmm. Vous pouvez ainsi conserver votre code organisé et encapsulé. Bien entendu, vous ne voyez pas l'aspect exact et les propriétés de l'élément graphique dérivé dans Glade, mais vous pouvez indiquer son emplacement, ses éléments graphiques enfants et les propriétés de la classe gtkmm de base.

Utilisez Gtk::Builder::get_widget_derived() ainsi :

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

Votre classe dérivée doit avoir un constructeur prenant comme paramètre un pointeur sur le type C sous-jacent et l'instance de Gtk::Builder. Toutes les classes gtkmm en rapport définissent leurs types C sous-jacents en tant qu'objets BaseObjectType (par exemple Gtk::Dialog défini son type BaseObjectType comme GtkDialog).

Vous devez faire appel au constructeur de la classe de base dans la liste d'initialisation, en fournissant le pointeur C. Par exemple,

DerivedDialog::DerivedDialog(BaseObjectType* cobject,
                             const Glib::RefPtr<Gtk::Builder>& builder)
: Gtk::Dialog(cobject)
{
}

Vous pouvez ensuite encapsuler les manipulations des éléments graphiques enfants dans le constructeur de la classe dérivée, avec peut-être get_widget() ou get_widget_derived() à nouveau. Par exemple,

DerivedDialog::DerivedDialog(BaseObjectType* cobject,
                             const Glib::RefPtr<Gtk::Builder>& builder)
: Gtk::Dialog(cobject),
  m_builder(builder),
  m_pButton(0)
{
  // Obtenir le bouton instancié par Glade 
  // et le connecter au gestionnaire de signal :
  m_builder->get_widget("quit_button", m_pButton);
  if(m_pButton)
  {
    m_pButton->signal_clicked().connect( sigc::mem_fun(*this,
                                   &DerivedDialog::on_button_quit) );
  }
}

XXV.III.I. Exemple

Cet exemple montre comment charger un fichier Glade au lancement et accéder aux éléments graphiques par l'intermédiaire d'une classe dérivée.

Code source

File: deriveddialog.h (For use with gtkmm 3, not gtkmm 2)

#ifndef GTKMM_EXAMPLE_DERIVED_DIALOG_H
#define GTKMM_EXAMPLE_DERIVED_DIALOG_H

#include <gtkmm.h>


class DerivedDialog : public Gtk::Dialog
{
public:
  DerivedDialog(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade);
  virtual ~DerivedDialog();

protected:
  //Signal handlers:
  void on_button_quit();

  Glib::RefPtr<Gtk::Builder> m_refGlade;
  Gtk::Button* m_pButton;
};

#endif //GTKMM_EXAMPLE_DERIVED_WINDOW_H

File: main.cc (For use with gtkmm 3, not gtkmm 2)

#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<Gtk::Builder> refBuilder = Gtk::Builder::create();
  try
  {
    refBuilder->add_from_file("basic.ui");
  }
  catch(const Glib::FileError& ex)
  {
    std::cerr << "FileError: " << ex.what() << std::endl;
    return 1;
  }
  catch(const Gtk::BuilderError& ex)
  {
    std::cerr << "BuilderError: " << ex.what() << std::endl;
    return 1;
  }

  //Get the GtkBuilder-instantiated dialog::
  DerivedDialog* pDialog = 0;
  refBuilder->get_widget_derived("DialogBasic", pDialog);
  if(pDialog)
  {
    //Start:
    kit.run(*pDialog);
  }

  delete pDialog;
    

  return 0;
}

File: deriveddialog.cc (For use with gtkmm 3, not gtkmm 2)

#include "deriveddialog.h"

DerivedDialog::DerivedDialog(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& 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.
}