Pergunta

Estou escrevendo um aplicativo em C ++ com o uso do GTK+ (não GTKMM), então preciso compilar usando o compilador G ++. É possível compilar aplicativos GTK+ com o compilador G ++? O GTK+ e as bibliotecas são compatíveis com o compilador G ++?

Estou tentando incorporar as funções GTK+ em uma aula como segue:

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

Eu estou fazendo a coisa certa? Estou recebendo erro de compilação on -line:

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

Qual é a maneira certa de fazer isso?

Foi útil?

Solução

O GTK+ é uma biblioteca baseada em C, portanto, você não pode dar a ele-membro da classe como retornos de chamada. Defina funções no estilo C como retornos de chamada, ou seja,

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
}

fora de qualquer declaração de classe. Ao registrar o sinal, você pode querer adicionar o objeto LoginWindow como user_data e simplesmente lançá-lo ao inserir o método e encaminhar a chamada, como assim

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

Se você quiser fazer o estilo C ++, dê uma olhada no GTKMM, que é o invólucro C ++ para GTK+, e isso lhe dará muito mais OOP para o seu dinheiro. É um pouco mais confuso trabalhar com sinais/retornos de chamada no GTKMM, mas é um tipo seguro e economizará muitas dores de cabeça no final.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top