QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1268|回复: 10

想搞点gtk的资料,哪里有啊?

[复制链接]
发表于 2006-6-14 08:08:02 | 显示全部楼层 |阅读模式
最近开始学习gtk,手头找到了两本书(下载),可是只有很少部分适合初学者,很多疑问不能找到解答。
以前在win下使用cb写东西非常方便,而gtk编程就很罗嗦,比如设置属性,这也就算了,也许习惯就好。关键有很多cb下比较容易实现的操作在我的gtk的基本书中怎么也没找到:

1 各种构件都有什么可用的信号?(最好有个列表)
2 构件的各种属性的读写函数都有什么?(个人认为这太不爽,比如书中只介绍了创建带标签的按钮,没说如何读出来,如何改。至于其他构件介绍得也很少)
3 可用的gtk自带的函数哪里有全一点的?
4 当有多个窗体的时候或者构件通过容器层层嵌套,访问某个构件是否需要像cb一样"Form1->btn1->啥"
5 ...
6 ...
...oo

实在不好意思问了,真的想知道那些gtk高手都是怎样练成的。
发表于 2006-6-14 08:53:56 | 显示全部楼层
一般是直接去看头文件。
1.应该是所有的信号都能响应,但有些被mask掉,gtk_widget_set_events可以设定响应的信号,控件独有的信号可以在GtkXxxxxClass结构里找到。
2.看头文件。
3.头文件。
4.不需要,这样也访问不了,除非你自己定义的结构。
回复

使用道具 举报

 楼主| 发表于 2006-6-14 09:25:03 | 显示全部楼层
开源的东西就是牛,你不想读他还逼着你读!
得了,我今天读gtk.h,敢明儿去读linux核心源代码。

4 那应该怎么访问其他窗口中的构件?
5 我在一个窗口中定义了一大堆构件(懒,使glade弄地),其中一个是label19,回调函数中用gtk_label_set_text(GTK_LABEL(label19),"New File comes!");时提示label19没定义!(头文件肯定都包含了)
6 大家边界面真的都是用vi或emacs作吗?我看用glade作得也不是很漠几,只是每改一点东西就得autogen.sh、make,时间太长!老大们都是怎么干的?

不好意思又问了这么多问题!    ——谁说mozilla横呀,多好的一个人那!我要是女的说啥也得搞到你!(流流须先—提问的智慧)
回复

使用道具 举报

发表于 2006-6-14 10:46:26 | 显示全部楼层
gtk就是这点麻烦,比如你定义了一个控件GtkWidget *wid;如果你想访问这个控件就得通过wid来访问,好像也有查询的方法,但我没用过,如果调用点跟wid不是一个域就麻烦了,只能通过参数传递。
回复

使用道具 举报

 楼主| 发表于 2006-6-14 15:19:00 | 显示全部楼层
通过参数传递倒是可以实现:
interface.c里面:
  g_signal_connect ((gpointer) RcvFile, "clicked",
                    G_CALLBACK (on_RcvFile_clicked),
                    GTK_OBJECT (label19));
callbacks.c里面:
void on_RcvFile_clicked                     (GtkButton       *button,   gpointer         user_data)
{
        GtkWidget *label = GTK_LABEL(user_data);       
        gtk_label_set_text(GTK_LABEL(label),"New File comes!");
        g_print("RcvFIle clicked!");
}
可是回调函数只有一个gpointer参数,我要是想在回调函数中处理几个interface.c中定义的构件,那该怎么办?
回复

使用道具 举报

发表于 2006-6-14 16:03:02 | 显示全部楼层
传一个结构的指针过去啊
回复

使用道具 举报

 楼主| 发表于 2006-6-14 18:08:51 | 显示全部楼层
还得这样啊!
怎么在gtk的教程中没有找到相关的章节呢?
http://www.gtk.org/tutorial/



(再次表示严重感谢!)
回复

使用道具 举报

发表于 2006-6-14 19:18:01 | 显示全部楼层
这不是gtk固有问题,就跟c++里传一个对象指针一样的,只不过在c里是结构。
另外如果是局部定义的结构,注意给结构动态分配内存,否则毁掉回调函数得到的指针所指向的内存可能已经被释放掉。
回复

使用道具 举报

 楼主| 发表于 2006-6-15 09:07:04 | 显示全部楼层
感谢您周密的指导!

我查了一下,原来lookup_widgetke()可是实现这个功能:
void on_RcvFile_clicked                     (GtkButton       *button,     gpointer         user_data)
{
        /*GtkWidget *label = GTK_LABEL(user_data);        */
        GtkWidget *label;
        label = lookup_widget (GTK_WIDGET (button), "label19");

        gtk_label_set_text(GTK_LABEL(label),"New File comes!");
        g_print("RcvFIle clicked!");
}
回复

使用道具 举报

 楼主| 发表于 2006-6-15 15:12:33 | 显示全部楼层
上面是同一个构件树中指向构件的方法,如何指向其他构件树(其他窗口)中的构件呢?
有提示说用g_object_set/get_data(),可我试了半天也没成功。
回复

使用道具 举报

 楼主| 发表于 2006-6-15 17:32:03 | 显示全部楼层
嘎嘎,终于整通了!
void
on_SendFile_clicked                    (GtkButton       *button,
                                        gpointer         user_data)/*主窗口中按钮的回调*/
{
        GtkWidget *about;

        about = create_filechooserdialog1();
        /*注册欲在about窗口构件的回调函数中引用的主窗口中的控件到about构件*/
        g_object_set_data (GTK_OBJECT (about), "windows1_label19",
                                                        lookup_widget (GTK_WIDGET (button), "label19"));

        gtk_widget_show(about);

}


void
on_SeleFileBtn_clicked                 (GtkButton       *button,
                                        gpointer         user_data)/*一个对话框中按钮的回调*/
{
        /*put the select file to windows1*/
        GtkWidget *windows1_label19;
        windows1_label19 = g_object_get_data (
                                         GTK_OBJECT (gtk_widget_get_toplevel(GTK_WIDGET(button))),
                                         "windows1_label19"); /*通过注册的字符串取出主窗口中的构件指针*/
        g_assert(windows1_label19);
        gtk_label_set_text(GTK_LABEL(windows1_label19),"Select a file!");/*可以引用的*/
               
        gtk_widget_destroy(gtk_widget_get_toplevel(GTK_WIDGET(button)));
}
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-2 14:32 , Processed in 0.036954 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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