【问题标题】:How to send multiple entrys to function - GTK如何将多个条目发送到函数 - GTK
【发布时间】:2014-01-05 18:37:20
【问题描述】:

我用 c - Black & Scholes 开发了一个财务计算器。我的老师希望我为此实现一个 GUI,他建议使用 GTK。由于我对 c 的了解不足(从一开始就是 java 程序员),这对我来说几乎是太多了,因为截止日期是 4 小时。但是经过辛勤工作和对stackoverflow的良好帮助,我想我有机会做到!但是现在有一个令人讨厌的障碍需要克服—— 那就是将多个条目传递给一个方法。简而言之 - 有五个输入字段,我想要的是通过 g_signal_connect_swapped 将所有这些发送到我提取调用字符串的方法。问题是只要只有一个字符串(一个条目),我就能够做到这一点(感谢帮助)。但是如何将所有这些条目发送到函数?

我试图声明一个向量但没有成功。由于错误,它甚至无法编译。

 static GtkWidget entry[5]

由于数组是一个指针(指向第一个元素),它应该可以工作 - 但不是!

更奇怪的是——我有另一个想法——我没有发送条目,而是尝试在主方法中提取字符串值——与函数中的语法完全相同——但没有成功。该值为空。

  const gchar *text;
  text = gtk_entry_get_text(GTK_ENTRY (entry_a));
  printf ("Result: %s\n", text);

上面的 sn-p 在函数中按expexted 工作 - 但在主函数中没有。为什么???

希望您理解我的问题 - 下面是生成 GUI 的代码。代码没有错误 - 这就是我将一个条目值发送到回调函数的地方。

 #include <stdio.h>
 #include <stdlib.h>
 #include <gtk/gtk.h>


 static GtkWidget *asset_label;
 static GtkWidget *frame;
 static GtkWidget *entry_a, *entry_s, *entry_v, *entry_t, *entry_r;
 static GtkWidget *label_a, *label_s, *label_v, *label_t, *label_r;
 static GtkWidget *window, *result_label, *button;
 static GtkWidget *table;

 static void entry_Submit(GtkWidget *entry, GtkWidget *widget) {

 const gchar *text;
 text = gtk_entry_get_text(GTK_ENTRY (entry_a));
 printf ("Result: %s\n", text);

 gtk_widget_destroy(GTK_WIDGET(label_a));

 label_a = gtk_label_new (text);
 gtk_grid_attach (GTK_GRID (table), label_a, 1, 0, 1, 1);

 gtk_widget_show(label_a);

 }


 static void destroy(GtkWidget *widget, gpointer data) {
     gtk_main_quit ();
 }



 static void initialize_window(GtkWidget* window) {
   gtk_window_set_title(GTK_WINDOW(window),"My Window"); //Set window title
   gtk_window_set_default_size (GTK_WINDOW (window), 400, 200); //Set default size for the window
   g_signal_connect (window, "destroy", G_CALLBACK (destroy), NULL); //End application when close button clicked

  }

 int main (int argc, char *argv[]) {
   //GtkWidget *window,*table,*label, *button;
   gtk_init(&argc, &argv);


   //Create the main window
   //window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
   //initialize_window(window);
     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      gtk_widget_set_size_request (GTK_WIDGET (window), 300, 300);
      gtk_window_set_title (GTK_WINDOW (window), "FINANCIAL CALCULATOR");
      g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
      g_signal_connect_swapped (window, "delete-event", G_CALLBACK (gtk_widget_destroy),    window);



    /* Create a 1x2 table */
    table = gtk_grid_new ();
    gtk_container_add (GTK_CONTAINER (window), table);

    //create a text box (asset price)
    entry_a = gtk_entry_new ();
    gtk_grid_attach (GTK_GRID (table), entry_a, 0, 0, 1, 1);

    // create a new label.
    label_a = gtk_label_new (" ASSET PRICE" );
    gtk_grid_attach (GTK_GRID (table), label_a, 1, 0, 1, 1);



    //create a text box (strike price)
    entry_s = gtk_entry_new ();
    gtk_grid_attach (GTK_GRID (table), entry_s, 0, 1, 1, 1);

    // create a new label.
    label_s = gtk_label_new (" STRIKE PRICE" );
    gtk_grid_attach (GTK_GRID (table), label_s, 1, 1, 1, 1);



    //create a text box (time to maturity)
    entry_t = gtk_entry_new ();
    gtk_grid_attach (GTK_GRID (table), entry_t, 0, 2, 1, 1);

    // create a new label.
    label_t = gtk_label_new (" TIME TO MATURITY" );
    gtk_grid_attach (GTK_GRID (table), label_t, 1, 2, 1, 1);



    //create a text box (volatility)
    entry_v = gtk_entry_new ();
    gtk_grid_attach (GTK_GRID (table), entry_v, 0, 3, 1, 1);

    // create a new label.
    label_v = gtk_label_new (" VOLATILITY" );
    gtk_grid_attach (GTK_GRID (table), label_v, 1, 3, 1, 1);



    //create a text box (interest rate)
    entry_r = gtk_entry_new ();
    gtk_grid_attach (GTK_GRID (table), entry_r, 0, 4, 1, 1);

    // create a new label.
    label_r = gtk_label_new (" INTEREST RATE" );
    gtk_grid_attach (GTK_GRID (table), label_r, 1, 4, 1, 1);



    button = gtk_button_new_with_label("Calculate");
    g_signal_connect_swapped (button, "clicked", G_CALLBACK (entry_Submit), entry_a);
    gtk_grid_attach (GTK_GRID (table), button, 0, 5, 2, 1);

    gtk_widget_show_all(window);

   gtk_main ();
   return 0;
 }

这些是我声明 GtkWidget 数组时的错误

1) 在 entry_submit 回调函数() 中我声明如下:

  text = gtk_entry_get_text(GTK_ENTRY (entry[0]));

编译错误:错误:下标值既不是数组也不是指针也不是向量

2) 在我声明以下内容的主函数中:

  entry[0] = gtk_entry_new ();

错误:从类型“struct GtkWidget *”分配给类型“GtkWidget”时类型不兼容

【问题讨论】:

  • 那是什么操作系统

标签: c pointers gtk gtk3


【解决方案1】:

一个指向指针的指针就是答案,同时使用 malloc,因为我在主函数中声明了 GtkWidget。

    GtkWidget **entry;
entry = malloc(5 * sizeof(GtkWidget));
entry[0] = entry_a;
entry[1] = entry_s;
entry[2] = entry_t;
entry[3] = entry_v;
entry[4] = entry_r;




g_signal_connect_swapped (button, "clicked", G_CALLBACK (entry_Submit), entry);

和功能

 static void entry_Submit(GtkWidget **entry, GtkWidget *widget) {

  GtkWidget *entry_ptr_a = entry[0];
  GtkWidget *entry_ptr_s = entry[1];
  GtkWidget *entry_ptr_t = entry[2];
  GtkWidget *entry_ptr_v = entry[3];
  GtkWidget *entry_ptr_r = entry[4];

  const gchar *a, *s, *t, *v, *r;


    a = gtk_entry_get_text(GTK_ENTRY (entry_ptr_a));
    s = gtk_entry_get_text(GTK_ENTRY (entry_ptr_s));
    t = gtk_entry_get_text(GTK_ENTRY (entry_ptr_t));
    v = gtk_entry_get_text(GTK_ENTRY (entry_ptr_v));
    r = gtk_entry_get_text(GTK_ENTRY (entry_ptr_r));


    printf ("Result: %s , %s, %s, %s, %s\n", a, s, t, v, r);

     }

【讨论】:

  • 您不需要使用malloc - 将数组声明为static GtkWidget *entries[5] 也可以正常工作。
猜你喜欢
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 2015-11-20
  • 2014-01-20
  • 1970-01-01
  • 2014-01-18
  • 2014-07-29
  • 1970-01-01
相关资源
最近更新 更多