2 Stimmen

Ich vermisse etwas Offensichtliches mit glade gtkbuilder und Verbindungssignale. Hilfe?

Ich mache meine Schnittstelle mit Glade. Funktioniert super. Ich schreibe eine winzig kleine Hauptfunktion, die gtkbuilder aufruft und rendert alles in der Glade-Datei.

Gtk::Main kit(num, opts);
// Load the GtkBuilder file and instantiate its widgets:
Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("dsg.glade", "mainwindow");

Funktioniert noch besser. Dann bekomme ich mein Widget

Gtk::Button *sf = 0;
builder->get_widget("button", sf);

Was nun? Jedes Beispiel, das ich gefunden habe, um einen Signalhandler zu verbinden, wird nicht von gtkbuilder erstellt. Wenn Sie Ihre eigene Klasse instanziieren, um eine Schaltfläche darzustellen/zu handhaben/zu rendern, ist es einfach, einen Signalhandler damit zu verbinden, aber ich verwende gtkbuilder und ich sehe nicht, wie ich eine Funktion schreiben kann, die ich dann an mein Widget anhängen kann, da ich nicht derjenige war, der das Schaltflächenobjekt erstellt hat, sondern gtkbuilder.

Mache ich eine Unterklasse von gtkbutton schreiben meine Funktion dann zeigen, dass? Aber meine Klasse wird nicht von gtkbuilder instanziiert.

Ich begreife es einfach nicht. Hilfe?

4voto

ptomato Punkte 53719

Sie übersehen nichts Offensichtliches. Es scheint, dass gtkmm keine C++ Version der gtk_builder_connect_signals() Funktion, so wie man es in C macht. Ich habe ein wenig bei Google gesucht, aber ich kann nicht herausfinden, warum sie es weglassen würden.

Sie können die C-Funktion direkt wie folgt aufrufen:

Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("dsg.glade", "mainwindow");
gtk_builder_connect_signals(builder->gobj(), callback_data);

3voto

Henning Punkte 31

Sollten Sie eine eigene Schaltflächenklasse wie diese verwenden:

#ifndef _MYBUTTON_H_
#define _MYBUTTON_H_

#include <gtkmm.h>
class MyButton : public Gtk::Button { 
  public:
    inline MyButton(BaseObjectType* cobject) : Gtk::Button(cobject) {};
  protected:
    // overwrite virtual void on_pressed() function of Gtk::Button
    void on_pressed() { /* do something */ };
};
#endif

Jetzt irgendwo in Ihrem Hauptcode (ich habe es in meiner Core-Klasse, die von public von Gtk::Window ist):

MyButton *sf;
refBuilder_->get_widget_derived("button", sf);

Dies habe ich in der offiziellen gtkmm-Handbuch vor einigen Monaten und verwende es erfolgreich in meinen GUI-Anwendungen.

Ich hoffe, das hilft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X