段力 2023-10-18 19:05 采纳率: 66.7%
浏览 1
已结题

关于#c语言#的问题:gtk变量(操作系统-linux)

#include <gtk/gtk.h>
 
gint count = 1;
 
void on_button_clicked(GtkWidget *button, gpointer userdata)
{
    g_print("Hello, this is a Hello function test.\n");
    g_print("%d\n", (gint)userdata);
    count = count + 1;
}
 
int main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *button;
 
    gtk_init(&argc, &argv);
 
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);
    gtk_window_set_title(GTK_WINDOW(window), "Hello Function");
    gtk_window_set_default_size(GTK_WINDOW(window), 500, 100);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_container_set_border_width(GTK_CONTAINER(window), 40);
 
    button = gtk_button_new_with_label("Press this Button will show a message in terminal");
    g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_button_clicked), (gpointer)count);
 
    gtk_container_add(GTK_CONTAINER(window), button);
 
    gtk_widget_show_all(window);
    gtk_main();
 
    return 0;
}

输出结果是

img

问题是count变量为什么不累加?

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-18 20:29
    关注

    【以下回答由 GPT 生成】

    问题分析: 在代码中,我们可以看到count变量是在main函数外定义的全局变量。而在on_button_clicked函数中,我们对count变量进行了+1的操作。但是无论点击按钮多少次,count的值都不会增加。

    解决方案: 问题的原因在于,我们在g_signal_connect函数中将count变量的指针作为userdata参数传递给了回调函数,但是我们没有在回调函数中对count变量进行修改。

    要解决这个问题,我们需要在回调函数on_button_clicked中通过指针修改count变量的值。

    首先,我们将回调函数的签名修改为:

    void on_button_clicked(GtkWidget *button, gpointer userdata)
    

    然后,在回调函数中,我们使用类型转换将userdata参数转换为整数类型指针,并通过解引用来修改count变量的值:

    void on_button_clicked(GtkWidget *button, gpointer userdata)
    {
        g_print("Hello, this is a Hello function test.\n");
        g_print("%d\n", *(gint*)userdata);
        *(gint*)userdata = *(gint*)userdata + 1;
    }
    

    这样,每次点击按钮后,count变量的值就会自动增加。

    完整的代码如下:

    #include <gtk/gtk.h>
    
    gint count = 1;
    
    void on_button_clicked(GtkWidget *button, gpointer userdata)
    {
        g_print("Hello, this is a Hello function test.\n");
        g_print("%d\n", *(gint*)userdata);
        *(gint*)userdata = *(gint*)userdata + 1;
    }
    
    int main(int argc, char *argv[])
    {
        GtkWidget *window;
        GtkWidget *button;
    
        gtk_init(&argc, &argv);
    
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);
        gtk_window_set_title(GTK_WINDOW(window), "Hello Function");
        gtk_window_set_default_size(GTK_WINDOW(window), 500, 100);
        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
        gtk_container_set_border_width(GTK_CONTAINER(window), 40);
    
        button = gtk_button_new_with_label("Press this Button will show a message in terminal");
        g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_button_clicked), (gpointer)&count);
    
        gtk_container_add(GTK_CONTAINER(window), button);
    
        gtk_widget_show_all(window);
        gtk_main();
    
        return 0;
    }
    

    希望这个解决方案对你有帮助。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月28日
  • 已采纳回答 10月20日
  • 创建了问题 10月18日

悬赏问题

  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!