如何在gtk + c中的回调之间进行通信 [英] How to communicate between callbacks in gtk+ c

查看:234
本文介绍了如何在gtk + c中的回调之间进行通信的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我现在正在开发一个项目,并且我正在尝试通过传递给它们相同的变量(回调函数共享相同的变量)来使两个回调函数相互通信。由于回调函数无法返回值,因此我已经传递了一个指向在主循环(main函数)中赋值的指针。
但是,它根本不起作用!



这是我的代码:

  #include< gtk / gtk.h> 

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


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


static void activate(GtkApplication * app,gpointer user_data)
{
GtkWidget * window;
GtkWidget * grid;
GtkWidget *按钮;
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状态;

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);

返回状态;

$ / code>

该程序在窗口中有3个按钮:


  1. 将值加1

  2. 将值加10
  3. 退出程序
  4. li>

value是主循环上的一个整数。当按下其中一个按钮(第一个或第二个按钮)时,值会变大(减少1或10),程序将打印新值。

我已经运行该程序并点击按钮,这就是我得到的:

 值是:46525384 
值是:46525384
值为:46157330
值为:-830528646
值为:56
值为:10

而不是:

 值为:1 
值为: 2
值为:12
值为:22
值为:23
值为: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;
值++;
printf(附加到行%d \\\
,值);
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 *按钮;

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状态;

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);

返回状态;
}

但是,由于某种原因,它不起作用。帮助将不胜感激!

解决方案

回答编辑

您必须显示小部件才能实现它们。最简单的方法是在父容器上调用 gtk_widget_show_all

  static void add_button(GtkWidget * widget,gpointer data)
{
static int value = 0;
GtkWidget * grid = data;
值++;
printf(附加到行%d \\\
,值);
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(附加到行%d \\\
,值);

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


I'm working on a project right now, and I am trying to make 2 callbacks communicate with each other by passing to them the same variable (the callbacks share the same variable). Since the callbacks cannot return a value, I have passed a pointer to the value which is assigned in the main loop (main function). However, it isn't working at all!

This is my code:

#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;
}

The program has 3 buttons in the window:

  1. adding 1 to value
  2. adding 10 to value
  3. quitting the program

value is an integer on the main loop. When one of the buttons (first or second) are pressed, the value getting bigger (by 1 or by ten) and the program prints the new value.

I have run the program and clicked the buttons and that's what I've got:

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

instead of:

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

Anyone knows why does it happen?

Thanks for helping!

Edit: I have tried the same thing, just instead of adding numbers to a value, I've tried to add button to the grid. Since the solution from the answer (under the question) worked at the previous code, I've made the grid global.

So here is the new code:

#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;
}

However, it didn't work from some reason. Help will be appreciated!

解决方案

Answer to the EDIT:

You must show the widgets in order for them to be realized. Simplest way is to call gtk_widget_show_all on the parent container:

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);
}

Another option, would be to keep a reference to the button and call gtk_widget_show on that instance. e.g.:

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);
}

这篇关于如何在gtk + c中的回调之间进行通信的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆