Компиляция приложения GTK + с помощью компилятора G ++

StackOverflow https://stackoverflow.com/questions/1636987

  •  06-07-2019
  •  | 
  •  

Вопрос

Я пишу приложение на 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 "&" ?)

Как правильно это сделать?

Это было полезно?

Решение

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 немного сложнее, но это безопасно для типов и в итоге избавит вас от многих головных болей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top