LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 745|回复: 5

初学gtk,有点地方不懂,请教一下

[复制链接]
发表于 2005-10-12 13:35:53 | 显示全部楼层 |阅读模式
《gtk+2.0编程范例》中的一个小程序:
#include<gtk/gtk.h>
gint count=1;
void on_button_clicked(GtkWidget *button,gpointer userdata)
{
        g_print("%d\n",(gint)userdata);
        count=count+1;
}

int main(int argc,char* argv[])
{
        gint count=1;
        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),"test");
        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("ush ME!");
    g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_button_clicked),(gpointer)count);
        gtk_container_add(GTK_CONTAINER(window),button);
        gtk_widget_show(button);
        gtk_widget_show(window);
        gtk_main();
        return FALSE;
}


    程序很简单,就是按一下push ME按键,就在终端中输出count,每输出一次,count就加1。这样每次输出的数字就依此加1。但是执行后每次输出的都是1。
    使用gdb调试,发现count每次都可以加1,而作为参数的userdata却没有增加,一直为1,于是输出便一直为1。
    请问这个
g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_button_clicked),(gpointer)count);
    到底是怎么工作的,是将count本身作为参数传给函数on_button_click还是一次性的将count的初试值1传递给on_button_click?
发表于 2005-10-12 13:38:26 | 显示全部楼层
一次性的将count的初试值1传递给on_button_click
gtk无法判断传入的参数是否是变量。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-12 16:46:56 | 显示全部楼层
我刚刚发现传递过去的是个gpointer,一个指针,按道理说是指向count的阿,为什么count改变了而userdata没有改变呢?
回复 支持 反对

使用道具 举报

发表于 2005-10-12 17:56:39 | 显示全部楼层
你没注意到 (gpointer)count 传递的是 count = 1, 而你又用g_print("%d\n",(gint)userdata);输出


g_signal_connect 只为你保存第一次调用时的userdata
自然而然,userdata如果不是1那就很不正常了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-13 13:30:00 | 显示全部楼层
看来是我理解错误,该学学学glib。不过我认为书上的程序是有问题的。。。

这样就对了
#include<gtk/gtk.h>
gint count=1;
void on_button_clicked(GtkWidget *button,gint* userdata)
{
        g_print("%d\n",*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),"\u6d63\uffff\u6fc2\u65a4\uffff\uffffhello!");
        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("test");
        g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_button_clicked),&count);
        gtk_container_add(GTK_CONTAINER(window),button);
        gtk_widget_show(button);
        gtk_widget_show(window);
        gtk_main();
        return FALSE;
}
回复 支持 反对

使用道具 举报

发表于 2005-10-13 20:44:28 | 显示全部楼层
这个例子书上确是错了.我弄了1天才发现.


  1. #include<gtk/gtk.h>
  2. gint count=1;
  3. void on_button_clicked(GtkWidget *button,gpointer userdata)
  4. {
  5. g_print("%d\n",(gint)userdata);
  6. count=count+1;
  7. }

复制代码

把这一断自己改一改.

另外,我也是GTK初学者,想结识GTK初学者共同提高.
最近打算作一个关于LINUX开发的网站.....
QQ:289275120
guanchuangsheng@163.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表