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

[GTK+] Podwójna lista rozwijana

Ostatnio zmodyfikowano 2013-10-07 10:17
Autor Wiadomość
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
C/C++
if( GTK_COMBO_BOX( combobox ) == "Na A" )
{
    gtk_combo_box_append_text( GTK_COMBO_BOX( combobox2 ), "Ananas" );
}
cały kod
C/C++
#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;
}
P-92855
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 » standard Cstrcmp. Jeżeli byś dalej miał problemy to pisz :)
P-92857
maniek1310
Temat założony przez niniejszego użytkownika
» 2013-09-29 14:50:59
Dalej nie działa
C/C++
#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 );
    }
}
P-92859
m4tx
» 2013-09-29 15:12:54
2 sprawy:
  • Zwalniasz pamięć po tablicy znaków (
    g_free( text );
    ), a potem porównujesz jej zawartość - tak nie można.
  • Korzystasz z
    GtkWidget * vbox;
    , ale nigdzie w obrębie funkcji nie przypisujesz temu wskaźnikowi adresu. Rozwiązanie - vbox jako zmienna globalna.
P-92862
maniek1310
Temat założony przez niniejszego użytkownika
» 2013-09-29 15:25:06
Program się kompiluje ale nie tworzy nowej listy
C/C++
#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 );
}
P-92863
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.
P-92868
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 ??
P-92878
Badman
» 2013-09-30 09:53:41
Pokaż wizualnie jak miało by to wyglądać, np. szkic.
P-92903
« 1 » 2
  Strona 1 z 2 Następna strona