Acceso a widgets

Para acceder a un widget, por ejemplo para mostrar (show()) un diálogo, use el método get_widget() proporcionándole el nombre del widget. Este nombre debe especificarse en la ventana Propiedades de Glade. Si no se encontró el widget, o si es del tipo incorrecto, se asignará 0 al puntero.

Gtk::Dialog* pDialog = 0;
builder->get_widget("DialogBasic", pDialog);

Gtk::Builder verifica si el puntero es nulo y si el widget es del tipo esperado, y le advertirá en la línea de comandos de estos casos.

Recuerde que no está instanciando un widget con get_widget(), sólo está obteniendo un puntero a uno que ya existe. Siempre recibirá un puntero a la misma instancia cuando llame a get_widget() en el mismo Gtk::Builder con el mismo nombre de widget. Los widgets se instancian durante Gtk::Builder::create_from_file().

get_widget() devuelve widgets hijos que gestiona manage() (consulte el capítulo Gestión de memoria), por lo que se eliminarán cuando se elimine su contenedor padre. Por lo tanto, si sólo obtiene un widget hijo de Gtk::Builder, en lugar de la ventana completa, debe ponerlo en un Container o bien eliminarlo. Las Windows (como Dialogs) no pueden gestionarse porque no tienen contenedor padre, por lo que debe eliminarlas en algún momento.

26.2.1. Ejemplo

Este ejemplo simple muestra cómo cargar un archivo Glade en tiempo de ejecución y acceder a los widgets con Gtk::Builder.

Código fuente

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

#include <gtkmm.h>
#include <iostream>

Gtk::Dialog* pDialog = 0;

static
void on_button_clicked()
{
  if(pDialog)
    pDialog->hide(); //hide() will cause main::run() to end.
}

int main (int argc, char **argv)
{
  Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example");

  //Load the GtkBuilder file and instantiate its widgets:
  Glib::RefPtr<Gtk::Builder> refBuilder = Gtk::Builder::create();
  try
  {
    refBuilder->add_from_file("basic.glade");
  }
  catch(const Glib::FileError& ex)
  {
    std::cerr << "FileError: " << ex.what() << std::endl;
    return 1;
  }
  catch(const Glib::MarkupError& ex)
  {
    std::cerr << "MarkupError: " << 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:
  refBuilder->get_widget("DialogBasic", pDialog);
  if(pDialog)
  {
    //Get the GtkBuilder-instantiated Button, and connect a signal handler:
    Gtk::Button* pButton = 0;
    refBuilder->get_widget("quit_button", pButton);
    if(pButton)
    {
      pButton->signal_clicked().connect( sigc::ptr_fun(on_button_clicked) );
    }

    app->run(*pDialog);
  }

  delete pDialog;

  return 0;
}