Компиляция приложения GTK+ с помощью компилятора G++
Я пишу приложение на C++ с использованием GTK+ (не gtkmm), поэтому мне нужно скомпилировать с помощью компилятора 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 "&" ?)
Как правильно это сделать?
1 ответ
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
}
вне каких-либо объявлений класса. При регистрации сигнала вы можете добавить сам объект LoginWindow как 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 немного сложнее, но это безопасный тип и, в конце концов, избавит вас от многих головных болей.