我工作的一個項目,現在,我想使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值
- 加入10爲值
- 退出程序
值是一個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;
}
但是,它並沒有從某些原因。幫助將不勝感激!
感謝您的幫助!你能幫助我嗎? https://stackoverflow.com/questions/44997120/printing-value-of-entry-box-in-a-dialog-in-gtk-c –