Acceso a widgets

To access a widget, for instance to show() a dialog, use the get_widget() method, providing the widget's name. This name should be specified in the Glade Properties window. If the widget could not be found, or is of the wrong type, then the pointer will be set to 0.

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.

Source Code

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;
}