2009-10-28 171 views
1

我正在用C++编写一个使用GTK +(不是gtkmm)的应用程序,因此我需要使用g ++编译器进行编译。是否可以用g ++编译器编译GTK +应用程序? GTK +和库与g ++编译器兼容吗?使用G ++编译器编译GTK +应用程序

我试图嵌入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 
} 

任何类声明之外。登记时的信号,你可能想在登录窗口对象自身添加为用户 - 数据并输入时的方法和 前进的号召,像简单地投这么

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

如果你想这样做ç虽然++风格,看看gtkmm,它是Gtk +的C++包装器,它会为您提供更多的OOP。在gtkmm中处理信号/回调有点麻烦,但它是安全的,最终会为您节省很多麻烦。