2009-10-28 4 views
1

Я пишу приложение на C++ с использованием GTK + (не gtkmm), поэтому мне нужно скомпилировать с помощью компилятора g ++. Можно ли скомпилировать приложения GTK + с помощью компилятора g ++? Являются ли GTK + и библиотеки совместимыми с компилятором g ++?Компиляция приложения GTK + с компилятором G ++

Я пытаюсь встроить GTK + вызов функций в классе, как следует:

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

Могу ли я делать это правильно? Я получаю ошибку компиляции в режиме онлайн:

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

Каков правильный путь?

ответ

4

Gtk + - это библиотека на основе C, поэтому вы не можете присвоить ей функции-члены как обратные вызовы. Определите функции C-стиля как обратные вызовы, то есть

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 
} 

вне любых деклараций классов. При регистрации сигнала, вы можете захотеть добавить сам пользователя появляется-объект как user_data и просто брось при входе в метод и вперед вызов, как и

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

Если вы хотите сделать это в C++ стиль, хотя, посмотрите на gtkmm, который является оболочкой C++ для Gtk +, и это даст вам намного больше ООП для вашего доллара. Немного более беспорядочно работать с сигналами/обратными вызовами в gtkmm, но это безопасный тип и сэкономит вам много головных болей в конце.

Смежные вопросы