Frage

Ich schreibe eine Anwendung in C ++ mit GTK+ (nicht GTKMM), daher muss ich mit G ++ - Compiler kompilieren. Ist es möglich, GTK+ -Anwendungen mit dem G ++ - Compiler zu kompilieren? Sind GTK+ und Bibliotheken mit dem G ++ - Compiler kompatibel?

Ich versuche, GTK+ -Funktionen in eine Klasse zu betten, wie folgt:

#include <gtk/gtk.h>
class LoginWindow
{
    public:
    LoginWindow();
    void on_window_destroy( GtkObject *object, gpointer user_data);

    private:

    GtkBuilder      *builder;
    GtkWidget       *window;
};

LoginWindow::LoginWindow()
{
    builder = gtk_builder_new ();
    gtk_builder_add_from_file (builder, "login_window.glade", NULL);
    window  = GTK_WIDGET (gtk_builder_get_object (builder, "login_window"));
    gtk_builder_connect_signals (builder, NULL);

    g_signal_connect( GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(on_window_destroy), NULL );
    g_object_unref (G_OBJECT (builder));
    gtk_widget_show (window);
}

void LoginWindow::on_window_destroy (GtkObject *object, gpointer user_data)
{
    gtk_main_quit ();
}

int main (int argc, char *argv[])
{
    gtk_init (&argc, &argv);

    LoginWindow loginWindow;

    gtk_main ();
    return 0;
}

Mache ich das richtig? Ich erhalte Kompilierfehler online:

g_signal_connect( GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(on_window_destroy), NULL );

login_window.cpp: In constructor "LoginWindow::LoginWindow()":
login_window.cpp:27: error: invalid use of member (did you forget the "&" ?)

Was ist der richtige Weg, es zu tun?

War es hilfreich?

Lösung

GTK+ ist eine C-basierte Bibliothek, sodass Sie ihr nicht als Rückrufe der Klassenleiterfunktionen geben können. Entweder definieren Sie die Funktionen im C-Stil als Rückrufe dh dh dh dh dh dh dh dh dh

extern "C"
void on_window_destroy( GtkObject *object, gpointer user_data)
{
  // do yer stuff.. keep in mind, there's no this-pointer here, it's not
  // associated with an object
}

außerhalb aller Klassenerklärungen. Bei der Registrierung des Signals möchten Sie möglicherweise das LoginWindow-Object selbst als user_data hinzufügen und einfach beim Eingeben der Methode abgeben und den Anruf weiterleiten, so wie dies

extern "C"
void on_window_destroy( GtkObject *object, gpointer user_data)
{
  static_cast<LoginWindow*>(user_data)->on_window_destroy();
}

Wenn Sie es tun möchten, schauen Sie sich GTKMM an, das ist der C ++ - Wrapper für GTK+, und es gibt Ihnen viel mehr OOP für Ihr Geld. Es ist ein bisschen chaotischer, mit Signalen/Rückernständen in GTKMM zu arbeiten, aber es ist sicher und spart Ihnen am Ende viele Kopfschmerzen.

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