Gtk+ - Przyciski i kilka pól typu entry

0

Siema.
Otóż tak wygląda kod przycisku:

g_signal_connect(G_OBJECT(nowe_dane), "clicked", G_CALLBACK(losowanie), wimie, wnazwisko);

A tak wygląda funkcja która za niego odpowiada:

void losowanie(GtkButton *nowe_dane, gpointer wimie, gpointer wnazwisko)
{
	string imie = open_file("imie.txt");
	gtk_entry_set_text(GTK_ENTRY(wimie), imie.c_str());

	string nazwisko = open_file("nazwisko.txt");
	gtk_entry_set_text(GTK_ENTRY(wnazwisko), nazwisko.c_str());
}

Z wimie działa bez problemu a z wnazwisko nie działa i wyskakuje:
user image

0

przekazujesz nulla

0

Tyle to wyczytałem sam z tego, dodam że po zamianie miejscami czyli wyglądało by tak:

g_signal_connect(G_OBJECT(nowe_dane), "clicked", G_CALLBACK(losowanie), wnazwisko, wimie);

Odpowiednia wartość pokazuje się w polu z nazwiskiem a błąd jest do pola wimie więc coś chyba jest nie tak w tej linijce.

1

do g_signal_connect parametr data jest jeden. po prostu ucina Ci drugi parametr.

https://developer.gnome.org/gobject/unstable/gobject-Signals.html#g-signal-connect

0

przelec to debuggerem i zobacz co sie dzieje. Nikt Ci z fusow nie wywrozy.
Moze nie otwiera nazwisko.txt

0
Johnny_Bit napisał(a):

do g_signal_connect parametr data jest jeden. po prostu ucina Ci drugi parametr.

To jest jakaś możliwość aby przekazać kilka?

1
ProbujeProgramowac napisał(a):

To jest jakaś możliwość aby przekazać kilka?

Jasne. Zrób strukturę z parametrami które chcesz przekazać i ją przekaż.

http://stackoverflow.com/questions/11808819/how-do-i-pass-multiple-variables-as-data-with-gtk-signals

0

Dzięki, no to biorę się do roboty.

0

Zrobiłem strukturę:

struct data
{
	GtkWidget *wimie;
	GtkWidget *wnaziwsko;
};

Wpisałem do niej dane:

data wpis =
	{
		wimie,
		wnazwisko
	};

Próbowałem tak to przesłać:

g_signal_connect(G_OBJECT(nowe_dane), "clicked", G_CALLBACK(losowanie), wpis);

Niestety jest błąd:
error C2664: 'gulong g_signal_connect_data(gpointer,const gchar *,GCallback,gpointer,GClosureNotify,GConnectFlags)' : cannot convert argument 4 from 'data' to 'gpointer'
A tak wygląda funkcja:

void losowanie(GtkButton *nowe_dane, data wpis)
{
	string imie = open_file("imie.txt");
	gtk_entry_set_text(GTK_ENTRY(wpis.wimie), imie.c_str());

	string nazwisko = open_file("nazwisko.txt");
	gtk_entry_set_text(GTK_ENTRY(wpis.wnaziwsko), nazwisko.c_str());
}

Niestety nie wiem co jest nie tak.

0

Po pierwsze użyj new do zaalokowania pamięci na tą struktuę i potem rzutuj to na gpointer i kod funkcji masz źle.

Tutaj jak powinno to wyglądać:

data *wpis = new data;
wpis->wimie = tworz tu widget
wpis->wnaziwsko = tworz tu widget

Przekazujesz tak:

g_signal_connect(G_OBJECT(nowe_dane), "clicked", G_CALLBACK(losowanie), (gpointer)wpis);

A funkcja wygląda tak:

void losowanie(GtkButton *nowe_dane, gpointer dane)
{
     data temp* = ((data*)dane);
    string imie = open_file("imie.txt");
    gtk_entry_set_text(GTK_ENTRY(temp->wimie), imie.c_str());
 
    string nazwisko = open_file("nazwisko.txt");
    gtk_entry_set_text(GTK_ENTRY(temp->wnaziwsko), nazwisko.c_str());
}
0

Rozumiem że mam usunąć moje wpisywanie danych do struktury i zamiast tego wstawić to:

data *wpis = new data;
wpis->wimie = tworz tu widget
wpis->wnaziwsko = tworz tu widget

Tylko że skoro widget jest już stworzony to po co mam go tworzyć od nowa? Widget i tworzenie pola typu entry było wyżej:

GtkWidget * wimie;
wimie = gtk_entry_new();

Ja chcę tylko odnieść się do tego pola entry w innej funkcji, no chyba że ja źle rozumiem i powinienem wpisać tam tak:

data *wpis = new data;
wpis->wimie = wimie;
wpis->wnaziwsko = wnazwisko;

Tak też zrobiłem i tutaj nie ma błędu jednak sypie błędami do tej funkcji co ma edytować to pole entry.

gtk_entry_set_text(GTK_ENTRY(temp->wimie), imie.c_str());

A błędy:

IntelliSense: expression must have pointer type
error C2819: type 'data' does not have an overloaded member 'operator ->'
error C2232: '->data::wimie' : left operand has 'struct' type, use '.'
1

Źle mnie zrozumiałeś.

Robisz:

data *wpis = new data;
I potem np wpis->wimie = gtk_entry_new();

W taki sposób się odwołujesz do struktury.
Przekazujesz do callbacka tak jak Ci już napisałem.

A w funkcji się pomyliłem, powinno być:

void losowanie(GtkButton *nowe_dane, gpointer dane)
{
     data *temp = ((data*)dane);
    string imie = open_file("imie.txt");
    gtk_entry_set_text(GTK_ENTRY(temp->wimie), imie.c_str());
 
    string nazwisko = open_file("nazwisko.txt");
    gtk_entry_set_text(GTK_ENTRY(temp->wnaziwsko), nazwisko.c_str());
}

Jak chcesz to wrzuć cały kod, wrzucę go do kompilatora, poprawię i Ci odeślę.

0

To wiele wyjaśnia, na razie nie mam czasu ale jak będę miał to wezmę się za to i poprawie według wzoru, gdyby były jeszcze jakieś problemy to napiszę.
Edit: Dziwne ale zostawiłem tak jak pisałem w poprzednim poście + zmieniłem kod funkcji i działa :) Tak więc temat do zamknięcia, no chyba że ktoś ma jakieś uwagi to proszę pisać.

1

Pamiętaj żeby potem zwolnić pamięć zaalokowaną przez new.

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