문제

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에서 신호/콜백으로 작업하는 것이 조금 더 지저분하지만, 안전한 유형이며 결국 많은 두통을 절약 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top