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... #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; }
|
|
MrPoxipol |
» 2014-01-02 13:37:02 |
|
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? |
|
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? |
|
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)
|
|
MrPoxipol |
» 2014-01-02 14:06:38 Pokaż kod. |
|
dejmien Temat założony przez niniejszego użytkownika |
» 2014-01-02 14:18:11 #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; }
|
|
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: void callback_func( GtkWidget * widget, ... gpointer callback_data ); Porównaj sobie swój kod z tym: #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. |
|
« 1 » 2 |