maniek1310 Temat założony przez niniejszego użytkownika |
[GTK+] Podwójna lista rozwijana » 2013-09-29 13:35:21 Witam chciałbym się dowiedzieć jak sprawdzić za pomocą if, który z elementów listy rozwijanej został kliknięty ?? tutaj if if( GTK_COMBO_BOX( combobox ) == "Na A" ) { gtk_combo_box_append_text( GTK_COMBO_BOX( combobox2 ), "Ananas" ); } cały kod #include <gtk/gtk.h>
void combo_selected( GtkWidget * widget, gpointer etykieta ) { gchar * text = gtk_combo_box_get_active_text( GTK_COMBO_BOX( widget ) ); gtk_label_set_text( GTK_LABEL( etykieta ), text ); g_free( text ); }
int main( int argc, char * argv[] ) { GtkWidget * okno; GtkWidget * combobox; GtkWidget * combobox2; GtkWidget * etykieta; GtkWidget * etykieta2; GtkWidget * vbox; 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, 100 ); vbox = gtk_vbox_new( FALSE, 1 ); gtk_container_add( GTK_CONTAINER( okno ), vbox ); etykieta = gtk_label_new( "Kategoria :" ); gtk_container_add( GTK_CONTAINER( vbox ), etykieta ); combobox = gtk_combo_box_new_text(); gtk_combo_box_append_text( GTK_COMBO_BOX( combobox ), "Na A" ); gtk_combo_box_append_text( GTK_COMBO_BOX( combobox ), "Na B" ); gtk_combo_box_append_text( GTK_COMBO_BOX( combobox ), "Na C" ); gtk_container_add( GTK_CONTAINER( vbox ), combobox ); combobox2 = gtk_combo_box_new_text(); if( GTK_COMBO_BOX( combobox ) == "Na A" ) { gtk_combo_box_append_text( GTK_COMBO_BOX( combobox2 ), "Ananas" ); } gtk_container_add( GTK_CONTAINER( vbox ), combobox2 ); etykieta2 = gtk_label_new( "" ); gtk_container_add( GTK_CONTAINER( vbox ), etykieta2 ); g_signal_connect( G_OBJECT( okno ), "destroy", G_CALLBACK( gtk_main_quit ), NULL ); g_signal_connect( G_OBJECT( combobox ), "changed", G_CALLBACK( combo_selected ),( gpointer ) etykieta2 ); gtk_widget_show_all( okno ); gtk_main(); return 0; }
|
|
m4tx |
» 2013-09-29 14:19:23 Chyba nie do końca wiesz, jak działają sygnały :) Zacznijmy może od tego, że kod, który dałeś, w ogóle się nie skompiluje. Próbujesz porównać obiekt listy rozwijanej z tablicą tekstową. To nie ma sensu i nie ma prawa w ogóle działać. Dodatkowo, próbujesz to robić zanim nawet wyświetlasz tę listę. Wywal więc w takim razie tego ifa co dałeś. Zainteresuj się natomiast funkcją combo_selected . Funkcja ta wywoływana jest właśnie wtedy, gdy element z listy zostanie wybrany. W zmiennej text którą tam masz, zapisany jest tekst wybranego elementu. Możesz go porównać z innym za pomocą funkcji strcmp. Jeżeli byś dalej miał problemy to pisz :) |
|
maniek1310 Temat założony przez niniejszego użytkownika |
» 2013-09-29 14:50:59 Dalej nie działa #include <gtk/gtk.h> #include <cstring>
void combo_selected( GtkWidget * widget, gpointer etykieta );
int main( int argc, char * argv[] ) { GtkWidget * okno; GtkWidget * combobox; GtkWidget * combobox2; GtkWidget * etykieta; GtkWidget * etykieta2; GtkWidget * vbox; 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, 100 ); vbox = gtk_vbox_new( FALSE, 1 ); gtk_container_add( GTK_CONTAINER( okno ), vbox ); etykieta = gtk_label_new( "Kategoria :" ); gtk_container_add( GTK_CONTAINER( vbox ), etykieta ); combobox = gtk_combo_box_new_text(); gtk_combo_box_append_text( GTK_COMBO_BOX( combobox ), "Na A" ); gtk_combo_box_append_text( GTK_COMBO_BOX( combobox ), "Na B" ); gtk_combo_box_append_text( GTK_COMBO_BOX( combobox ), "Na C" ); gtk_container_add( GTK_CONTAINER( vbox ), combobox ); etykieta2 = gtk_label_new( "" ); gtk_container_add( GTK_CONTAINER( vbox ), etykieta2 ); g_signal_connect( G_OBJECT( okno ), "destroy", G_CALLBACK( gtk_main_quit ), NULL ); g_signal_connect( G_OBJECT( combobox ), "changed", G_CALLBACK( combo_selected ),( gpointer ) etykieta2 ); gtk_widget_show_all( okno ); gtk_main(); return 0; }
void combo_selected( GtkWidget * widget, gpointer etykieta ) { GtkWidget * combobox2; GtkWidget * vbox; gchar * text = gtk_combo_box_get_active_text( GTK_COMBO_BOX( widget ) ); gtk_label_set_text( GTK_LABEL( etykieta ), text ); g_free( text ); if( strcmp( text, "Na A" ) == 0 ) { combobox2 = gtk_combo_box_new_text(); gtk_combo_box_append_text( GTK_COMBO_BOX( combobox2 ), "ASDASD" ); gtk_container_add( GTK_CONTAINER( vbox ), combobox2 ); } else { combobox2 = gtk_combo_box_new_text(); gtk_combo_box_append_text( GTK_COMBO_BOX( combobox2 ), "AAAAA" ); gtk_container_add( GTK_CONTAINER( vbox ), combobox2 ); } }
|
|
m4tx |
» 2013-09-29 15:12:54 |
|
maniek1310 Temat założony przez niniejszego użytkownika |
» 2013-09-29 15:25:06 Program się kompiluje ale nie tworzy nowej listy #include <gtk/gtk.h> #include <cstring>
GtkWidget * vbox;
void combo_selected( GtkWidget * widget, gpointer etykieta );
int main( int argc, char * argv[] ) { GtkWidget * okno; GtkWidget * combobox; GtkWidget * combobox2; GtkWidget * etykieta; GtkWidget * etykieta2; 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, 100 ); vbox = gtk_vbox_new( FALSE, 1 ); gtk_container_add( GTK_CONTAINER( okno ), vbox ); etykieta = gtk_label_new( "Kategoria :" ); gtk_container_add( GTK_CONTAINER( vbox ), etykieta ); combobox = gtk_combo_box_new_text(); gtk_combo_box_append_text( GTK_COMBO_BOX( combobox ), "Na A" ); gtk_combo_box_append_text( GTK_COMBO_BOX( combobox ), "Na B" ); gtk_combo_box_append_text( GTK_COMBO_BOX( combobox ), "Na C" ); gtk_container_add( GTK_CONTAINER( vbox ), combobox ); etykieta2 = gtk_label_new( "" ); gtk_container_add( GTK_CONTAINER( vbox ), etykieta2 ); g_signal_connect( G_OBJECT( okno ), "destroy", G_CALLBACK( gtk_main_quit ), NULL ); g_signal_connect( G_OBJECT( combobox ), "changed", G_CALLBACK( combo_selected ),( gpointer ) etykieta2 ); gtk_widget_show_all( okno ); gtk_main(); return 0; }
void combo_selected( GtkWidget * widget, gpointer etykieta ) { GtkWidget * combobox2; gchar * text = gtk_combo_box_get_active_text( GTK_COMBO_BOX( widget ) ); gtk_label_set_text( GTK_LABEL( etykieta ), text ); if( strcmp( text, "Na A" ) == 0 ) { combobox2 = gtk_combo_box_new_text(); gtk_combo_box_append_text( GTK_COMBO_BOX( combobox2 ), "ASDASD" ); gtk_container_add( GTK_CONTAINER( vbox ), combobox2 ); } else { combobox2 = gtk_combo_box_new_text(); gtk_combo_box_append_text( GTK_COMBO_BOX( combobox2 ), "AAAAA" ); gtk_container_add( GTK_CONTAINER( vbox ), combobox2 ); } g_free( text ); }
|
|
m4tx |
» 2013-09-29 16:12:01 Tworzy, tylko nie jest ona wyświetlana :) Po utworzeniu listy musisz walnąć gtk_widget_show_all( okno ); - okno będzie wtedy jakby "odświeżone", co też poskutkuje wyświetleniem nowo utworzonego combo boksa na ekranie. Oczywiście wtedy musisz też uczynić okno zmienną globalną, gdyż inaczej nie będzie ono dostępne z poziomu funkcji combo_selected . // EDIT: Chociaż tak sobie teraz jeszcze myślę czy nie wystarczyłoby samo wyświetlenie vboksa lub nawet samego combo boksa - testowałem z oknem i działało; jeśli chcesz, możesz też sprawdzić z samym vboksem lub listą - niewykluczone, że też działać będzie. |
|
maniek1310 Temat założony przez niniejszego użytkownika |
» 2013-09-29 17:32:07 Może napisze ci jakie ma być działanie programu to może poradzisz mi co by było lepiej do tego użyć, chciałbym stworzyć program wyświetlający opis płyt głównych, więc potrzebuje kilku comboboxów.
Producent typ socketu (amd, intel) socket chipset no i lista płyt głównych
I to ma działać tak że w zależności co wybiorę to combobox poniższy będzie miał inne wartości.
Czy może użyć do tego jakieś innej kontrolki ?? |
|
Badman |
» 2013-09-30 09:53:41 Pokaż wizualnie jak miało by to wyglądać, np. szkic. |
|
« 1 » 2 |