Question

J'écris une application en C ++ avec GTK + (pas gtkmm), donc je dois compiler avec le compilateur g ++. Est-il possible de compiler des applications GTK + avec le compilateur g ++? GTK + et les bibliothèques sont-ils compatibles avec le compilateur g ++?

J'essaie d'incorporer des fonctions GTK + dans une classe comme suit:

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

Est-ce que je le fais bien? Je reçois une erreur de compilation en ligne:

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 "&" ?)

Quelle est la bonne façon de le faire?

Était-ce utile?

La solution

Gtk + est une bibliothèque basée sur C, vous ne pouvez donc pas lui donner des fonctions de membre de classe en tant que rappels. Définissez les fonctions de style C comme des rappels, c.-à-d.

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
}

en dehors de toute déclaration de classe. Lors de l’enregistrement du signal, vous pouvez ajouter l’objet LoginWindow lui-même en tant que user_data et le lancer simplement lors de la saisie de la méthode et transférer l'appel, comme si

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

Si vous voulez toutefois utiliser le style c ++, jetez un œil à gtkmm, qui est le wrapper c ++ de Gtk +, et cela vous donnera beaucoup plus de POO pour votre argent. C’est un peu plus compliqué de travailler avec des signaux / rappels dans gtkmm, mais c’est sûr et cela vous évitera beaucoup de maux de tête à la fin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top