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

Pomoc z GTkEntry.

Ostatnio zmodyfikowano 2014-01-02 15:57
Autor Wiadomość
dejmien
Temat założony przez niniejszego użytkownika
Pomoc z GTkEntry.
» 2014-01-02 13:33:41
Witam.

Zainteresowałem się ostatnio GtkEntry i czytając dokumentacje okazało się że GtkEntry to narzędzie bardzo rozbudowane.

Według dokumentacji z gtkentry da się pobierać tekst, tak wiem że od tego może być GtkTextView, ale mi pod względem estetycznym bardziej przypadł do gustu gtkentry.

Robię wszystko dokładnie tak jak jest w dokumentacji i nici... nic nie działa...

C/C++
#include <gtk/gtk.h>
#include <iostream>

const gchar * tekst;
void pokaz( GtkEntryBuffer * bufor )
{
    GtkWidget * okno;
    GtkWidget * entry;
    GtkWidget * etykieta;
    GtkWidget * vbox;
   
    GtkEntryBuffer * bufor2;
   
    tekst = gtk_entry_buffer_get_text( GTK_ENTRY_BUFFER( bufor ) );
   
    okno = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_window_set_title( GTK_WINDOW( okno ), "Kurs GTK" );
    gtk_window_set_position( GTK_WINDOW( okno ), GTK_WIN_POS_CENTER );
    gtk_window_set_default_size( GTK_WINDOW( okno ), 230, 60 );
   
    vbox = gtk_vbox_new( FALSE, 1 );
    gtk_container_add( GTK_CONTAINER( okno ), vbox );
   
    etykieta = gtk_label_new( "Wpisany tekst:" );
    gtk_container_add( GTK_CONTAINER( vbox ), etykieta );
   
    entry = gtk_entry_new();
    bufor2 = gtk_entry_get_buffer( GTK_ENTRY( entry ) );
    gtk_entry_buffer_set_text( GTK_ENTRY_BUFFER( bufor2 ), tekst, - 1 );
   
    gtk_container_add( GTK_CONTAINER( vbox ), entry );
   
   
    gtk_widget_show_all( okno );
   
   
}


int main( int argc, char * argv[] )
{
    GtkWidget * okno;
    GtkWidget * entry;
    GtkWidget * etykieta;
    GtkWidget * vbox;
   
    GtkEntryBuffer * bufor;
   
    gtk_init( & argc, & argv );
   
    okno = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_window_set_title( GTK_WINDOW( okno ), "Kurs GTK+" );
    gtk_window_set_position( GTK_WINDOW( okno ), GTK_WIN_POS_CENTER );
    gtk_window_set_default_size( GTK_WINDOW( okno ), 230, 60 );
   
    vbox = gtk_vbox_new( FALSE, 1 );
    gtk_container_add( GTK_CONTAINER( okno ), vbox );
   
    etykieta = gtk_label_new( "Wpisz tekst:" );
    gtk_container_add( GTK_CONTAINER( vbox ), etykieta );
   
    entry = gtk_entry_new();
    bufor = gtk_entry_get_buffer( GTK_ENTRY( entry ) );
   
   
    gtk_container_add( GTK_CONTAINER( vbox ), entry );
   
   
   
   
   
    g_signal_connect( G_OBJECT( okno ), "destroy", G_CALLBACK( pokaz ), entry );
   
    gtk_widget_show_all( okno );
   
    gtk_main();
   
    return 0;
}
P-100921
MrPoxipol
» 2014-01-02 13:37:02
https://developer.gnome.org​/gtk3/3.4​/GtkEntry.html#gtk-entry-get-text ??
std::string str( gtk_entry_get_text( GTK_ENTRY( entry ) );
ewentualnie możesz sobie użyć dynamicznych tablic zamiast stringa.
P-100923
dejmien
Temat założony przez niniejszego użytkownika
» 2014-01-02 13:48:10
No string to dla mnie będzie najlepszym wyborem więc fajnie że można użyć stringa.

A to mam użyć w tej funkcji main czy w drugiej funkcji która zostanie wywołana po zamknięciu okna?
P-100926
MrPoxipol
» 2014-01-02 13:50:55
A to mam użyć w tej funkcji main czy w drugiej funkcji która zostanie wywołana po zamknięciu okna?
W tej, w której chcesz pobrać tekst..czy to takie nielogiczne?
P-100928
dejmien
Temat założony przez niniejszego użytkownika
» 2014-01-02 13:56:31
Zrobiłem tak jak mówiłeś. Użyłem
std::cout << str;
 aby sprawdzić czy faktycznie pobiera tekst i wywaliło mi taki błąd:


Gtk-CRITICAL **: IA__gtk_entry_get_text: assertion 'GTK_IS_ENTRY (entry)' failed
terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_S_construct null not valid
Przerwane (core dumped)
P-100931
MrPoxipol
» 2014-01-02 14:06:38
Pokaż kod.
P-100933
dejmien
Temat założony przez niniejszego użytkownika
» 2014-01-02 14:18:11
C/C++
#include <gtk/gtk.h>
#include <iostream>


void pokaz( GtkEntry * entry )
{
   
   
   
    std::string str( gtk_entry_get_text( GTK_ENTRY( entry ) ) );
   
   
    std::cout << str;
   
}


int main( int argc, char * argv[] )
{
    GtkWidget * okno;
    GtkWidget * entry;
    GtkWidget * etykieta;
    GtkWidget * vbox;
   
    GtkEntryBuffer * bufor;
   
    gtk_init( & argc, & argv );
   
    okno = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_window_set_title( GTK_WINDOW( okno ), "Kurs GTK+" );
    gtk_window_set_position( GTK_WINDOW( okno ), GTK_WIN_POS_CENTER );
    gtk_window_set_default_size( GTK_WINDOW( okno ), 230, 60 );
   
    vbox = gtk_vbox_new( FALSE, 1 );
    gtk_container_add( GTK_CONTAINER( okno ), vbox );
   
    etykieta = gtk_label_new( "Wpisz tekst:" );
    gtk_container_add( GTK_CONTAINER( vbox ), etykieta );
   
    entry = gtk_entry_new();
    bufor = gtk_entry_get_buffer( GTK_ENTRY( entry ) );
   
   
    gtk_container_add( GTK_CONTAINER( vbox ), entry );
   
   
   
   
   
    g_signal_connect( G_OBJECT( okno ), "destroy", G_CALLBACK( pokaz ), entry );
   
    gtk_widget_show_all( okno );
   
    gtk_main();
   
    return 0;
}

P-100936
MrPoxipol
» 2014-01-02 14:22:19
Funkcja, która jest wykonywana po wykryciu sygnału powinna posiadać argumenty: wskaźnik do GtkWidget, i gpointer (void*).
Wygląd funkcji callbackowej:
C/C++
void callback_func( GtkWidget * widget,
.../* other signal arguments */
gpointer callback_data );

Porównaj sobie swój kod z tym:
C/C++
#include <gtk/gtk.h>
#include <string>

void on_button_clicked( GtkWidget * widget, gpointer data )
{
    std::string str( gtk_entry_get_text( GTK_ENTRY( data ) ) );
    g_print( str.c_str() );
}

int main( int argc, char * argv[] )
{
    GtkWidget * win, * vbox, * entry, * button;
    gtk_init( & argc, & argv );
   
    win = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    vbox = gtk_box_new( GTK_ORIENTATION_VERTICAL, 1 );
    entry = gtk_entry_new();
    button = gtk_button_new_with_label( "Przeslij" );
   
    gtk_container_add( GTK_CONTAINER( win ), vbox );
    gtk_container_add( GTK_CONTAINER( vbox ), entry );
    gtk_container_add( GTK_CONTAINER( vbox ), button );
   
    g_signal_connect( G_OBJECT( win ), "destroy", G_CALLBACK( gtk_main_quit ), NULL );
    g_signal_connect( G_OBJECT( button ), "clicked", G_CALLBACK( on_button_clicked ), entry );
   
    gtk_widget_show_all( win );
    gtk_main();
   
    return 0;
}

PS Kod jest w GTK 3, więc musisz tylko zmienić linijkę odpowiadającą za tworzenie kontenera.
P-100937
« 1 » 2
  Strona 1 z 2 Następna strona