Shak Marifkhonov
Shak Marifkhonov

Reputation: 1

Pass parameters from ComboBox to GTKTreeView in C

In C Language, how is it possible to pass the values in ComboBox to GtkTreeView? We have tried this code, but we do not know where to write the ids of ComboBox. What signals should be used in ComboBox?

   void on_btn_car_order_clicked(GtkButton *button, gpointer *user_data){
    GtkTreeIter iter;

    GtkTreeView *treeview_payment1 = GTK_TREE_VIEW(user_data);
    GtkListStore *liststore1 = GTK_LIST_STORE(gtk_tree_view_get_model(treeview_payment1));
    gtk_list_store_append(liststore1, &iter);
    gtk_list_store_set(liststore1, &iter, 0, "asdas" , 1, 1.0,2, 10.0, -1);    
    gtk_widget_hide (GTK_WIDGET(detail_window));
    gtk_widget_show(listree_window);     
}

GtkTreeView GtkWindow with ComboBox

Thank you, Best regards, Shak

Upvotes: 0

Views: 95

Answers (1)

Siva Guru
Siva Guru

Reputation: 694

#include <gtk/gtk.h>

typedef struct
{
    GtkWidget *w_car_choose;
    GtkWidget *w_model_choose;
    GtkWidget *w_submit_button;
    GtkWidget *w_treeview;
} app_widgets;

GtkBuilder *builder;
GtkWidget *main_window;
GtkWidget *listtree_window;

void on_btn_submit_clicked(GtkButton *button, gpointer *user_data);

int main(int argc, char *argv[])
{

    app_widgets *widgets = g_slice_new(app_widgets);

    gtk_init(&argc, &argv);

    builder = gtk_builder_new();
    gtk_builder_add_from_file(builder, "test.glade", NULL);

    main_window = GTK_WIDGET(gtk_builder_get_object(builder, "main_window"));
    listtree_window = GTK_WIDGET(gtk_builder_get_object(builder, "listtree_window"));


    // get pointers to widgets
    widgets->w_treeview = GTK_WIDGET(gtk_builder_get_object(builder, "treeview"));
    widgets->w_car_choose = GTK_WIDGET(gtk_builder_get_object(builder, "car_choose"));
    widgets->w_model_choose = GTK_WIDGET(gtk_builder_get_object(builder, "model_choose"));
    widgets->w_submit_button = GTK_WIDGET(gtk_builder_get_object(builder, "btn_submit"));
    gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->w_car_choose), 1);
    gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->w_model_choose), 1);

    gtk_builder_connect_signals(builder, widgets);

    g_object_unref(builder);

    gtk_widget_show(main_window);

    g_signal_connect(GTK_WIDGET(widgets->w_submit_button), "clicked", G_CALLBACK(on_btn_submit_clicked), widgets);

    gtk_main();
    g_slice_free(app_widgets, widgets);

    return 0;
}

void on_btn_submit_clicked(GtkButton *button, gpointer *user_data)
{
    app_widgets *widgets = user_data;

    GtkTreeIter iter;
    GtkListStore *liststore = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(widgets->w_treeview)));
    gtk_list_store_append(liststore, &iter);
    gtk_list_store_set(liststore, &iter, 0, gtk_combo_box_text_get_active_text(GTK_COMBO_BOX(widgets->w_model_choose)), 1, gtk_combo_box_text_get_active_text(GTK_COMBO_BOX(widgets->w_car_choose)), -1);

    gtk_widget_hide(GTK_WIDGET(main_window));
    gtk_widget_show(listtree_window);
}

// called when window is closed
void on_window_main_destroy()
{
    gtk_main_quit();
}

if you want to pass customized data during onClick signal then connect using

g_signal_connect

https://developer.gnome.org/gobject/stable/gobject-Signals.html. and generally, for connecting signals, you can manually connect it using g_connect as mostly during your program you might want to modify data's which will be stored in your struct so instead of using glade for it, you can manually connect.

#suggestions(if your actual program is gonna look like this). you could finish the above program in a single main window by adding an Add button to "listtree_window" window and making "main_window" a dialog box.

Upvotes: 0

Related Questions