Πρόσβαση γραφικών συστατικών

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 ελέγχει για έναν μηδενικό δείκτη και ελέγχει ότι το γραφικό συστατικό είναι του αναμενόμενου τύπου και θα εμφανίσει προειδοποιήσεις στη γραμμή εντολών για αυτά.

Να θυμάστε ότι δεν δημιουργείτε ένα γραφικό συστατικό με τη get_widget(), απλά παίρνετε έναν δείκτη στο ήδη υπάρχον. Θα δεχτείτε πάντα έναν δείκτη στο ίδιο στιγμιότυπο, όταν καλείτε την get_widget() στην ίδια Gtk::Builder, με το ίδιο όνομα γραφικού συστατικού. Τα γραφικά συστατικά δημιουργούνται κατά τη διάρκεια της Gtk::Builder::create_from_file().

Η get_widget() επιστρέφει θυγατρικά γραφικά συστατικά που είναι manage()ed (δείτε το κεφάλαιο Διαχείριση μνήμης), έτσι θα διαγραφούν όταν ο γονικός τους περιέκτης διαγράφεται. Έτσι, αν πάρετε μόνο ένα θυγατρικό γραφικό συστατικό από την Gtk::Builder, αντί για ένα πλήρες παράθυρο, τότε πρέπει ή να το βάλετε σε έναν Container ή να το διαγράψετε. Η Windows (όπως η Dialogs) δεν μπορεί να διαχειριστεί, επειδή δεν έχουν γονικό περιέκτη, έτσι πρέπει να τα διαγράψετε σε κάποιο σημείο.

26.2.1. Παράδειγμα

Αυτό το απλό παράδειγμα εμφανίζει πώς να φορτώσετε ένα αρχείο Glade στον χρόνο εκτέλεσης και να προσπελάσετε τα γραφικά συστατικά με την 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;
}