G ++ 컴파일러로 GTK+ 애플리케이션을 컴파일합니다
문제
GTKMM (GTKMM 아님)을 사용하여 C ++로 응용 프로그램을 작성하고 있으므로 G ++ 컴파일러를 사용하여 컴파일해야합니다. G ++ 컴파일러로 GTK+ 응용 프로그램을 컴파일 할 수 있습니까? 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 "&" ?)
올바른 방법은 무엇입니까?
해결책
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-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 ++ 래퍼 인 GTKMM을 살펴보십시오. GTKMM에서 신호/콜백으로 작업하는 것이 조금 더 지저분하지만, 안전한 유형이며 결국 많은 두통을 절약 할 수 있습니다.
제휴하지 않습니다 StackOverflow