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ą.