Pregunta

Estoy escribiendo una aplicación en C ++ usando GTK + (no gtkmm), así que necesito compilar usando el compilador g ++. ¿Es posible compilar aplicaciones GTK + con el compilador g ++? ¿Son compatibles GTK + y las bibliotecas con el compilador de g ++?

Estoy intentando incrustar la llamada a funciones GTK + en una clase como la siguiente:

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

¿Lo estoy haciendo bien? Recibo un error de compilación en línea:

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

¿Cuál es la forma correcta de hacerlo?

¿Fue útil?

Solución

Gtk + es una biblioteca basada en C, por lo que no puede asignarle funciones de miembro de clase como devoluciones de llamada. Defina las funciones de estilo C como devoluciones de llamada, es decir,

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
}

fuera de cualquier declaración de clase. Al registrar la señal, es posible que desee agregar el objeto LoginWindow en sí mismo como user_data y simplemente emitirlo al ingresar el método y reenviar la llamada, así

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

Sin embargo, si desea hacerlo al estilo c ++, eche un vistazo a gtkmm, que es el contenedor de c ++ para Gtk +, y le dará mucha más OOP por su dinero. Es un poco más complicado trabajar con señales / devoluciones de llamada en gtkmm, pero es seguro y te ahorrará muchos dolores de cabeza al final.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top