Muss ich manuell eine gtk Signal-Handler an, wenn ich den Namen der Funktion in Lichtung angegeben?

StackOverflow https://stackoverflow.com/questions/4089077

  •  28-09-2019
  •  | 
  •  

Frage

Ich schreibe mein erstes gtk-Programm, mit gtkmm und Lichtung. Ich habe einen filechooserbutton und es hat ein Signal namens Datei-Set Also habe ich eingestellt, dass zu dem, was ich nehme an der Funktionsname ist möchte ich es nennen, wenn die Datei ausgewählt wird. Aber dann sehe ich hier: http://library.gnome.org /devel/gtkmm-tutorial/unstable/sec-builder-accessing-widgets.html.en

, dass sie manuell den Dialog Widget bekommen und eine Schaltfläche Signal-Handler in der Code-Einstellung. Welches ist der richtige Weg, es zu tun?

Und während ich hier keine Links zu guten Beispielen praktisch sein würde, scheinen sie zwischen wenigen und weit zu sein. Danke.

War es hilfreich?

Lösung

Dies ist, wie ich es getan hätte:

// create the UI
refUI = Gtk::Builder::create();
refUI->add_from_file(grq::GLADE_FILE);

// grab your widget
refUI->get_widget("but_new", but_new); // Gtk::ToolButton *but_new;
but_new->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::on_new_game));

// your signal handler looks something like this :)
void MainWindow::on_new_game() {}

Bearbeiten

Grundsätzlich ist die * das ist das Objekt, auf dem Sie die Funktion Ihrer Signal-Handler aufrufen wird.

Dies ist, was mein Haupt aussieht:

int main(int argc, char **argv) {

    Gtk::Main       kit(argc, argv);
    MainWindow      main_window;

    kit.run(*main_window.window);

    return 0;
}

MainWindow ist im Grunde eine Klasse, die GtkWindow wickelt und definiert die Widgets, ein. la:.

class MainWindow
{

private:
Glib::RefPtr<Gtk::Builder> refUI;

//
// Widgets
//

Gtk::ToolButton *but_about;

public:

// The window. This is public so we can hook into events and
// call kit.run(window) against it, if needed.
Gtk::Window *window;


MainWindow()
{
    // Load the data for this window and it's widgets.
    refUI = Gtk::Builder::create();
    refUI->add_from_file(grq::GLADE_FILE);


    // The window
    refUI->get_widget("main_window", window);


    // Widgets              
    refUI->get_widget("but_about", but_about);
    but_about->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::on_about));

            ...

}


virtual ~MainWindow()
{
    if (window != NULL)
    {
        delete window; // Frees all the children for the window, too.
    }
}

    virtual void on_about()
    {
            // stuff
    }

};

Hope, das hilft!

Andere Tipps

fand ich die Antwort auf meine Frage, wie ein nachträglicher Einfall in eine andere Stackoverflow Frage.

Aber ich kann mich nicht erinnern, welche es war.

Die Antwort scheint zu sein, dass Sie programmatisch die Signal-Handler auf das Widget in Ihrem Code hinzufügen, die gtkbuilder tun es nicht für Sie.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top