Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

GTK, problem z wczytaniem tekstu ze zmiennej.

Ostatnio zmodyfikowano 2013-12-26 22:59
Autor Wiadomość
dejmien
Temat założony przez niniejszego użytkownika
GTK, problem z wczytaniem tekstu ze zmiennej.
» 2013-12-26 13:00:45
Witam.

Mam pewien problem z GTK. Mianowicie chcę zrobić taki myk że w Gtktekstview użytkownik wpisze jakiś tekst, ten tekst zostanie zapisany do bufora i gdy użytkownik zamknie okno to zostanie wyświetlone nowe okno z Gtktekstview, które pokaże ten sam tekst, który wpisał użytkownik do poprzedniego okna. Wszystko w celach testowych chcę sprawdzić czy działa pobieranie tekstu, ale najwidoczniej coś robię źle... ok zamieszczam kod pierwszej funkcji, której zadaniem jest pobrać tekst od użytkownika.

C/C++
void tekst( int argc, char * argv[] )
{
   
    GtkWidget * okno;
    GtkWidget * textView;
    GtkTextBuffer * bufor;
    GtkTextIter iter;
    GtkTextIter its;
    GtkTextIter itk;
   
    okno = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_window_set_position( GTK_WINDOW( okno ), GTK_WIN_POS_CENTER );
    gtk_window_set_default_size( GTK_WINDOW( okno ), 250, 200 );
    gtk_window_set_title( GTK_WINDOW( okno ), "Szyfrowanie" );
    gtk_container_set_border_width( GTK_CONTAINER( okno ), 10 );
   
    textView = gtk_text_view_new();
    bufor = gtk_text_view_get_buffer( GTK_TEXT_VIEW( textView ) );
    gtk_text_buffer_get_iter_at_offset( bufor, & iter, 0 );
    gtk_text_buffer_get_end_iter( bufor, & itk );
    gtk_text_buffer_get_start_iter( bufor, & its );
    gtk_container_add( GTK_CONTAINER( okno ), textView );
    tkst = gtk_text_buffer_get_text( bufor, & its, & itk, FALSE );
    g_signal_connect( G_OBJECT( okno ), "destroy", G_CALLBACK( tekst2 ), NULL );
   
    gtk_widget_show_all( okno );
}

Chcę tutaj dodać że
static gchar * tkst;
 jest użyta jako globalna.

Tutaj znajdue się funkcja, któa zostaje wyświetlona po zamknięciu pierwszego okna i któa ma wyświetlić ten tekst:

C/C++
void tekst2( int argc, char * argv[] )
{
    GtkWidget * okno;
    GtkWidget * textView;
    GtkTextBuffer * bufor;
    GtkTextIter iter;
   
   
    okno = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_window_set_position( GTK_WINDOW( okno ), GTK_WIN_POS_CENTER );
    gtk_window_set_default_size( GTK_WINDOW( okno ), 250, 200 );
    gtk_window_set_title( GTK_WINDOW( okno ), "Szyfrowanie" );
    gtk_container_set_border_width( GTK_CONTAINER( okno ), 10 );
   
    textView = gtk_text_view_new();
    bufor = gtk_text_view_get_buffer( GTK_TEXT_VIEW( textView ) );
    gtk_text_buffer_get_iter_at_offset( bufor, & iter, 0 );
    gtk_text_buffer_insert( bufor, & iter, tkst, - 1 );
    gtk_widget_show_all( okno );
}
P-100150
MrPoxipol
» 2013-12-26 14:05:00
Chcesz przypisać tekst do adresu?
Dokumentacja
strcpyKopiuje łańcuch znaków do tablicy znaków. (funkcja)
P-100159
dejmien
Temat założony przez niniejszego użytkownika
» 2013-12-26 14:44:13
No, ale czy od wyciągnięcia tekstu z bufora nie służy funkcja ,,gtk_text_buffer_get_text''? 
P-100165
MrPoxipol
» 2013-12-26 15:25:04
Służy. Ale zwraca ten coś..Skorzystaj z dokumentacji to zobaczysz..
P-100168
dejmien
Temat założony przez niniejszego użytkownika
» 2013-12-26 20:12:32
Nie działa mi to... wyświetla się puste okienko... Nie wiem jak to ma dokładnie wyglądać, ale robię tak że przy pomocy ,,gtk_text_buffer_get_text'' wyciągam tekst z bufora a następnie przy pomocy tej funkcji co ty mi podałeś kopiuje łańcuch znaków do tablicy znaków...
P-100224
czosnek17
» 2013-12-26 21:16:54
Po co do tych funkcja dajesz argc i argv? No na razie to działa tak: tworzysz okno, wczytujesz pustą zawartość z textView i ustawiasz zdarzenie przejścia do następnej funkcji jeżeli okno zostanie zamknięte. Nowe okno jest puste, bo nie dodajesz textViewa do kontenera.
Tak jak już pisałem w textViewie nie wyświetli się tekst z poprzedniego okna, bo go nie pobierasz (tylko raz na początku programu, gdy textView jest pusty) więc przed zamknięciem okna musisz to zrobić i wypisać go do nowego okna.

C/C++
g_signal_connect( G_OBJECT( okno ), "destroy", G_CALLBACK( tekst2 ), NULL );
Jak myślisz, od czego jest ostatni argument? :)
P-100244
dejmien
Temat założony przez niniejszego użytkownika
» 2013-12-26 21:47:56
Faktycznie nie zauważyłem że zapomniałem umieścić Gtktekstwiev w kontenerze.

Nie mam pojęcia od czego jest ostatni argument :-) A argc i argv w funkcji używam bo gdzieś czytałem żeby używać tych argumentów bo są konieczne...

No tak wyświetlam puste okno bo chcę pobrać tekst ten który wpisze użytkownik do okna.
C/C++
tkst = gtk_text_buffer_get_text( bufor, & its, & itk, FALSE );

Ale przecież pobieram ten tekst przed zamknięciem okna.. o to CI chodzi tak??
P-100249
czosnek17
» 2013-12-26 22:09:49
Nie mam pojęcia od czego jest ostatni argument :-) A argc i argv w funkcji używam bo gdzieś czytałem żeby używać tych argumentów bo są konieczne...
Używasz w funkcji, czy tylko je przekazujesz? Ja trochę pisałem w GTK i jedyne miejsce, gdzie ich używam to
gtk_init( & argc, & argv );
 w funkcji main. Poza tym tutaj te argumenty tracą prawidłową wartość, a raczej w funkcjach nie są tym co myślisz. Pierwszy argument to kontrolka dla której jest odbierane zdarzenie, a drugi to NULL (w tym przypadku).

Nie mam pojęcia od czego jest ostatni argument :-) A argc i argv w funkcji używam bo gdzieś czytałem żeby używać tych argumentów bo są konieczne...
W ostatnim argumencie możesz przesłać cokolwiek do funkcji, która będzie uruchomiona po wykryciu zdarzenia. Czyli możesz przesłać swój texView i w tekst2() odczytać jego zawartość i zapisać ją do nowego textViewa. Pamiętaj, że ostatni argument podany przy g_signal_conect() odbierasz w funkcji jako drugi.

Ale przecież pobieram ten tekst przed zamknięciem okna.. o to CI chodzi tak??
Nie pobierasz przed zamknięciem okna, ale przed ustawianiem zdarzenia zamknięcia okna. Polecam jeszcze poczytać kurs.
Podsumowując musisz przekazać textView do tekst2() i tam pobrać z niego tekst.
Np
C/C++
g_signal_connect( G_OBJECT( okno ), "destroy", G_CALLBACK( tekst2 ), textView );
//Można to odebrać tak:
void tekst2( aaa bbb, GtkWidget * textView2 )
Masz włączoną konsolę w projekcie? Jeżeli nie to włącz, będziesz mógł sprawdzać jak działa program (cout), a GTK czasem wypisuje błędy do konsoli.
P-100255
« 1 » 2
  Strona 1 z 2 Następna strona