LinuxSir.cn,穿越时空的Linuxsir!

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

菜鸟急问:gtk两个窗口之间怎么传递信息

[复制链接]
发表于 2008-7-10 22:25:35 | 显示全部楼层 |阅读模式
现有两个窗口,窗口A和窗口B。代码是用glade2生成的。
A有一个按钮,B有一个文本输入框。

如何实现以下的功能:
点击窗口A中的按钮button后激活窗口B,用户在窗口B的文本框输入内容后,把内容传回给button的clicked回调函数,在函数里对这个字符串继续进行操作。

谢谢!
发表于 2008-7-11 10:22:09 | 显示全部楼层
我也是个菜鸟,我也遇到过你这个问题,有三种解决方法:
1、你可以在button的回调函数中声明一个数组,然后把数组指针作为参数传递给B窗口,然后在B中把数组名作为B窗口的回调函数的一个参数,传递给B的回调函数,直接修改数组,这样在button中就能得到了。
2、你可以在B窗口的create函数中添加一个变量,并注册好,然后create B之后在B中修改该变量,B窗口销毁后(只销毁窗口,但是B作为一个变量是没有被销毁的),在button的回调函数中可以使用lookup查找你添加的变量名,然后处理。
3、这是一种笨办法,跟上面的方法也基本相同,就是使用g_object_set_data()和g_object_get_data()来手工实现注册,和lookup。
我不知道有没有更好的办法,我开始做的时候用的第一种和第3种,都可以用。
回复 支持 反对

使用道具 举报

发表于 2008-7-21 14:40:31 | 显示全部楼层
您要是能给一个例子就太好了
回复 支持 反对

使用道具 举报

发表于 2008-7-23 16:26:00 | 显示全部楼层
我又找到了更好的方法,button的回调函数如下:
  1. void
  2. on_A_button_clicked                    (GtkButton       *button,
  3.                                         gpointer         user_data)
  4. {
  5. GtkWidget *B=create_B();
  6. if(gtk_dialog_run(GTK_DIALOG(B))==GTK_RESPONSE_OK)
  7. {
  8. g_print("%s",gtk_entry_get_text(GTK_ENTRY(lookup_widget(B,"entry1"))));//这里就可以直接获取到在B窗口中输入的内容了;最重要的是不需要依靠B界面的“确定”按钮的回调函数。
  9. }
  10. }
复制代码
如果用前面说的3种方法都需要修改interface.c和interface.h文件(如果使用了glade的话),很不好,很麻烦的方法。这里要说明一下:B一定要是模态的。
回复 支持 反对

使用道具 举报

发表于 2008-7-24 21:44:31 | 显示全部楼层
似乎挺能钻研的啊。
回复 支持 反对

使用道具 举报

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

本版积分规则

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