Problem z g_signal_connect w GTK+

0

Witam. Ostatnio zacząłem się bawić biblioteką GTK+. Przerabiając jej zagadnienia doszedłem do etapu w którym utworzyłem sobie klasę przycisków. Jednak samo tworzenie przycisku to mało interesująca rzecz, przydałoby się żeby coś robił. Tak więc znalazłem jak to odpalić za pomocą g_signal_connect. Zrobiłem tak jak było opisane i wszystko ok. Postanowiłem jednak dodać funkcję do mojej klasy jako składową. I tu zaczynają się schody. Gdyż kompilator zaczyna mi wyrzucać błąd: error: invalid use of member function (did you forget the ‘()’ ?).
Kod wygląda następująco:

main.cpp:

#include "Button.h"

int main(int argc, char * argv[])
{
    //Okno i kontener dla programu
    GtkWidget * window;
    GtkWidget * container;

    //Inicjalizacja gtk, tworzenie okna i kontenera
    gtk_init(&argc, &argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(window), 300, 300);
    container = gtk_fixed_new();
    gtk_container_add(GTK_CONTAINER(window), container);

    //Przyciski
    Button button;

    button.newButton(container, "bla");

    //Ustawianie domyslnej akcji zamkniecia procesu po wcisnieciu 'X'
    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);

    //Akcja przycisku
    g_signal_connect(button.button, "clicked",G_CALLBACK (button.printMessage), NULL);

    //Uruchamianie okna
    gtk_widget_show_all(window);
    gtk_main();

    return 0;
}

Button.cpp:

 
#include "Button.h"

void Button::newButton(GtkWidget * container, const char * label)
{
    button = gtk_button_new_with_label(label);
    gtk_widget_set_size_request(button, width, height);
    gtk_fixed_put(GTK_FIXED(container), button, posX, posY);
}

void Button::printMessage(GtkWidget *widget, gpointer data)
{
    g_print ("Hello World\n");
}

Button.h:

 
#include <gtk/gtk.h>

class Button
{
    public:

    GtkWidget * button;

    int posX = 100;
    int posY = 100;
    int height = 30;
    int width = 150;

    void newButton(GtkWidget * container, const char * label);
    void printMessage(GtkWidget *widget, gpointer data);
};

Gdy przeniosę funkcję printMessage z powrotem do main'a, i zmienię z button.printMessage na printMessage to wszystko zaczyna działać. Nie wiem jak to zrobić aby funkcja ta stała się jednak funkcją składową.

0

Spróbuj tak:
g_signal_connect(button.button, "clicked",G_CALLBACK (**&**button.printMessage), NULL);

Jednak do czystego pisania w C++ lepiej użyć gtkmm

1 użytkowników online, w tym zalogowanych: 0, gości: 1