Gtk+ - Przyciski i kilka pól typu entry

Gtk+ - Przyciski i kilka pól typu entry
PP
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 10 lat
  • Postów:27
0

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

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

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

Kopiuj
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

fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0

przekazujesz nulla

PP
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 10 lat
  • Postów:27
0

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

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

edytowany 1x, ostatnio: ProbujeProgramowac
Johnny_Bit
  • Rejestracja:ponad 22 lata
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Kielce
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


HAKGER - 50% Complete
edytowany 2x, ostatnio: Johnny_Bit
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0

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

PP
Przeczytaj co napisałem wyżej :)
PP
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 10 lat
  • Postów:27
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?

Johnny_Bit
  • Rejestracja:ponad 22 lata
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Kielce
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


HAKGER - 50% Complete
edytowany 1x, ostatnio: Johnny_Bit
PP
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 10 lat
  • Postów:27
0

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

PP
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 10 lat
  • Postów:27
0

Zrobiłem strukturę:

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

Wpisałem do niej dane:

Kopiuj
data wpis =
	{
		wimie,
		wnazwisko
	};

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

Kopiuj
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:

Kopiuj
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ć:

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

Przekazujesz tak:

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

A funkcja wygląda tak:

Kopiuj
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());
}
PP
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 10 lat
  • Postów:27
0

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

Kopiuj
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:

Kopiuj
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:

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

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

A błędy:

Kopiuj
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 '.'
edytowany 1x, ostatnio: ProbujeProgramowac
1

Źle mnie zrozumiałeś.

Robisz:

Kopiuj
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ć:

Kopiuj
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ę.

PP
  • Rejestracja:około 11 lat
  • Ostatnio:prawie 10 lat
  • Postów:27
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ć.

edytowany 1x, ostatnio: ProbujeProgramowac
1

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

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)