2017-07-07 37 views
1

我工作的一個項目,現在,我想使2個回調相互通信通過傳遞給他們相同的變量(回調共享相同的變量)之間的通信。由於回調函數無法返回值,因此我已經傳遞了一個指向在主循環(main函數)中賦值的指針。 但是,它根本不工作!如何在GTK回調+ C

這是我的代碼:

#include <gtk/gtk.h> 

static void inc_val (GtkWidget *widget, gpointer data) 
{ 
    int* value = data; 
    *value++; 
    printf("value is: %d\n", *value); 
} 

static void inc_val_ten (GtkWidget *widget, gpointer data) 
{ 
    int* value = data; 
    *value+=10; 
    printf("value is: %d\n", *value); 
} 

static void activate (GtkApplication *app, gpointer user_data) 
{ 
    GtkWidget *window; 
    GtkWidget *grid; 
    GtkWidget *button; 
    int value = 0; 

    window = gtk_application_window_new (app); 
    gtk_window_set_title (GTK_WINDOW (window), "Window"); 
    gtk_container_set_border_width (GTK_CONTAINER (window), 10); 

    grid = gtk_grid_new(); 
    gtk_container_add (GTK_CONTAINER (window), grid); 

    button = gtk_button_new_with_label ("Add 1 to value"); 
    g_signal_connect (button, "clicked", G_CALLBACK (inc_val), &value); 
    gtk_grid_attach (GTK_GRID (grid), button, 0, 0, 1, 1); 

    button = gtk_button_new_with_label ("Add 10 to value"); 
    g_signal_connect (button, "clicked", G_CALLBACK (inc_val_ten), &value); 
    gtk_grid_attach (GTK_GRID (grid), button, 1, 0, 1, 1); 

    button = gtk_button_new_with_label ("Quit"); 
    g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window); 
    gtk_grid_attach (GTK_GRID (grid), button, 0, 1, 2, 1); 

    gtk_widget_show_all (window); 
} 

int main (int argc, char **argv) 
{ 
    GtkApplication *app; 
    int status; 

    app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE); 
    g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); 
    status = g_application_run (G_APPLICATION (app), argc, argv); 
    g_object_unref (app); 

    return status; 
} 

該程序在窗口3個按鈕:

  1. 加1值
  2. 加入10爲值
  3. 退出程序

值是一個INTE ger在主循環。當按下按鈕時(第一或第二)的一個,該值變得更大(由1或10)和程序打印的新值。

我已經運行該程序並點擊按鈕,這就是我有:的

value is: 46525384 
value is: 46525384 
value is: 46157330 
value is: -830528646 
value is: 56 
value is: 10 

代替:

value is: 1 
value is: 2 
value is: 12 
value is: 22 
value is: 23 
value is: 33 

的人都知道它爲什麼會發生?

感謝您的幫助!

編輯:我已經嘗試過相同的事情,只是而不是將數字添加到值,我試圖添加按鈕到網格。由於答案(在問題之下)的解決方案適用於以前的代碼,因此我已將網格設爲全局。

因此,這裏是新代碼:

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

GtkWidget *grid; 

static void add_button (GtkWidget *widget, gpointer data) 
{ 
    static int value = 0; 
    GtkWidget* grid = data; 
    value++; 
    printf("attach to line %d\n", value); 
    gtk_grid_attach(GTK_GRID(grid), gtk_button_new_from_stock(GTK_STOCK_NEW), 0, value, 1, 1); 
} 

static void activate (GtkApplication *app, gpointer user_data) 
{ 
    GtkWidget *window; 
    GtkWidget *button; 

    window = gtk_application_window_new (app); 
    gtk_window_set_title (GTK_WINDOW (window), "Window"); 
    gtk_container_set_border_width (GTK_CONTAINER (window), 10); 

    grid = gtk_grid_new(); 
    gtk_container_add (GTK_CONTAINER (window), grid); 

    button = gtk_button_new_with_label ("Add Button"); 
    g_signal_connect (button, "clicked", G_CALLBACK (add_button), grid); 
    gtk_grid_attach (GTK_GRID (grid), button, 0, 0, 1, 1); 

    gtk_widget_show_all (window); 
} 

int main (int argc, char **argv) 
{ 
    GtkApplication *app; 
    int status; 

    app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE); 
    g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); 
    status = g_application_run (G_APPLICATION (app), argc, argv); 
    g_object_unref (app); 

    return status; 
} 

但是,它並沒有從某些原因。幫助將不勝感激!

回答

1

應答傳送至編輯

,您必須出示小部件,以便於實現它們。最簡單的方法是調用gtk_widget_show_all父容器上:

static void add_button (GtkWidget *widget, gpointer data) 
{ 
    static int value = 0; 
    GtkWidget* grid = data; 
    value++; 
    printf("attach to line %d\n", value); 
    gtk_grid_attach(GTK_GRID(grid), 
    gtk_button_new_from_stock(GTK_STOCK_NEW), 0, value, 1, 1); 
    gtk_widget_show_all(grid); 
} 

另一種選擇,將是一個參考保持到按鈕,在該實例調用gtk_widget_show。例如:

static void add_button (GtkWidget *widget, gpointer data) 
{ 
    static int value = 0; 
    GtkWidget* grid = data; 
    GtkWidget* button = gtk_button_new_from_stock(GTK_STOCK_NEW); 

    value++; 
    printf("attach to line %d\n", value); 

    gtk_grid_attach(GTK_GRID(grid), button, 0, value, 1, 1); 
    gtk_widget_show (button); 
} 
+0

感謝您的幫助!你能幫助我嗎? https://stackoverflow.com/questions/44997120/printing-value-of-entry-box-in-a-dialog-in-gtk-c –

1

value是本地activate。當activate完成時,其局部變量消失;你傳遞給處理程序的指針現在毫無意義。

的解決方案是使value倖存應用程序的整個壽命。一個最簡單的(但可能不是最乾淨的)方法是使其成爲全局的。

+0

我嘗試了將按鈕添加到網格的同樣的事情。但它也沒有工作。我用一些更詳細的信息編輯了這個問題。順便說一句,而不是一個全局變量,它適用於本地靜態變量:)感謝您的幫助! @ user58697 –