在 C 语言中将参数从 ComboBox 传递给 GTKTreeView

Pass parameters from ComboBox to GTKTreeView in C

提问人:Shak Marifkhonov 提问时间:12/12/2019 更新时间:12/15/2019 访问量:87

问:

在C语言中,如何将ComboBox中的值传递给GtkTreeView?我们已经尝试了这段代码,但我们不知道在哪里写 ComboBox 的 id。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 与 ComboBox

谢谢 此致敬意 摇晃

c 组合框 gtk3 gtktreeview

评论

0赞 Siva Guru 12/13/2019
更详细地解释您的要求会有所帮助。就像你想把组合框传递给树视图一样?
0赞 Shak Marifkhonov 12/13/2019
如果你看一下这张图片(GtkWindow with ComboBox),你可以看到一个“订单”按钮。on_btn_car_order_clicked 我们尝试将 ComBox 中的值传递给 Label,它有效。
0赞 Siva Guru 12/13/2019
因此,在按顺序时,您希望将数据传递给 treeView 并填充表。如果可能的话,你能分享你的代码吗?对我来说,提出更改建议会更容易。
0赞 Shak Marifkhonov 12/14/2019
我可以在哪里将我的代码发送给您,我认为它不适合这里。
0赞 Siva Guru 12/14/2019
您可以将其上传到某个在线云存储站点,并允许我编辑它。

答:

0赞 Siva Guru 12/15/2019 #1
#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();
}

如果要在 onClick 信号期间传递自定义数据,请使用

g_signal_connect

https://developer.gnome.org/gobject/stable/gobject-Signals.html。 通常,对于连接信号,您可以使用g_connect手动连接它,因为在程序期间,您可能希望修改将存储在结构中的数据,因此您可以手动连接,而不是使用格莱德。

#suggestions(如果你的实际程序看起来像这样)。您可以通过在“listtree_window”窗口中添加“添加”按钮并使“main_window”对话框在单个主窗口中完成上述程序。

评论

0赞 Siva Guru 12/15/2019
在 Glade 文件中,删除“OnClick”处理程序的“提交”按钮
0赞 Shak Marifkhonov 12/15/2019
int i = 0;char *p = strtok (car_name, “ ”);字符 *data[100];而 (p) { data[i++] = p; p = strtok (NULL, “ ”);printf(“从数据[0]打印值: %s\n”, data[0]);gtk_list_store_set(liststore1, &iter, 0, data[0], 1, data[1], 2, data[2], 3, data[3], 4, data[4], 5, data[5], 6, data[6], 7, data[7], 8, data[8], 9, data[9], 10, data[10], -1);[RINTF正在工作,而gtk_list_store_set不起作用。我该如何解决这个问题?
0赞 Siva Guru 12/16/2019
(developer.gnome.org/glib/stable/...)尝试使用 Glib 字符串实用程序函数。strtok() 本质上是不安全的 (stackoverflow.com/questions/8957829/strtok-segmentation-fault)