LinuxSir.cn,穿越时空的Linuxsir!

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

一个新手关于GTK+的问题

[复制链接]
发表于 2009-12-9 18:11:48 | 显示全部楼层 |阅读模式
怎样在GTK+中实现多个entry文本框间用回车跳转啊,例如,在entry1中编辑完之后,按回车键,输入焦点转到entry2,然后再转到entry3......
     我找了很多资料,只是知道要用捕捉“key_press_event“的方法,但我做试过之后,entry控件就只对回车键有反应,按其他任何键entry都没变化,也就是无法输入进去信息。而且,虽然是捕捉到了回车信号,也不知道怎样让焦点转移到下一个控件。
       另外,我看到有的资料上说,通过上下文标号可以实现控件间的信号连续性,我知道在Delphi中这个上下文标号很好实现,而且通过上下文标号来处理一些事件很方便,就比如我的这个回车跳转的问题,如果通过上下文标号处理可以忽略控件的类型,只要对应的控件可以响应这个事件即可。哪位好心的大侠能不能顺便告诉我一下GTK+的这个上下文标号具体是怎么实现的?
发表于 2009-12-10 09:01:22 | 显示全部楼层
响应key-press-event信号,用gtk_widget_grab_focus切换焦点。
不懂啥叫上下文标号。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-12-10 16:51:12 | 显示全部楼层
非常感谢版主的回复。
至于上下文的标号,大概是我描述的不准确,引起了大家的歧义。它就是相当于一个组件的一种属性。比如,在一个窗口中有文本框,按钮和其他的组件,在这一个窗口里,每个组件都有一个自己的编号,可以通过这个编号可以访问对应的组件。希望这回大家能明白!
唉,自己的表达能力有点弱,让大家受累了。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-12-10 20:24:59 | 显示全部楼层
再次感谢版主,问题已经圆满解决,而且我还发现捕捉activate信号也可以,而且要比捕捉key_press_event信号要略为简单一点。捕捉key_press_event信号事,entry组件有时会不响应其他的键,也就是无法录入信息,只对回车键有反应,不知道为什么,但我也没发现其中有什么规律。如果有知道的还请赐教,游侠在这里先行谢过。下面我把自己处理焦点转移的代码贴出来,大家看看有没有什么不妥的地方,其中捕捉两种信号的代码都有,而且都可以使用。

#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h> //用第二种方法时要用到的头文件

/*第一种方法的处理函数
void key_enter(GtkWidget *widget,gpointer data)
{
    gtk_widget_grab_focus(data);
}
*/

//下面为第二种方法的处理函数
void key_enter(GtkWidget *widget,GdkEventKey *event,gpointer data)
{
    if(event->keyval==GDK_KP_Enter)
        gtk_widget_grab_focus(data);
}
int main(int argc,char *argv[])
{
    GtkWidget *window;
    GtkWidget *box;
    GtkWidget *entry[3];
    int i;

    gtk_init(&argc,&argv);

    window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_widget_set_usize(window,500,300);
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);

    box=gtk_hbox_new(FALSE,3);
    for(i=0;i<3;i++)
    {
        entry=gtk_entry_new();
        gtk_box_pack_start(GTK_BOX(box),entry,FALSE,FALSE,3);
    }

    gtk_container_set_border_width(GTK_CONTAINER(box),3);
    gtk_container_add(GTK_CONTAINER(window),box);
/*第一种方法的函数调用,捕捉activate信号
    g_signal_connect(G_OBJECT(entry[0]),"activate",G_CALLBACK(key_enter),entry[1]);
    g_signal_connect(G_OBJECT(entry[1]),"activate",G_CALLBACK(key_enter),entry[2]);
    g_signal_connect(G_OBJECT(entry[2]),"activate",G_CALLBACK(key_enter),entry[0]);
*/

//下面的为第二种方法的调用,捕捉“key_press_event"信号
    g_signal_connect(G_OBJECT(entry[0]),"key_press_event",G_CALLBACK(key_enter),entry[1]);
    g_signal_connect(G_OBJECT(entry[1]),"key_press_event",G_CALLBACK(key_enter),entry[2]);
    g_signal_connect(G_OBJECT(entry[2]),"key_press_event",G_CALLBACK(key_enter),entry[0]);

    g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);

    gtk_widget_show_all(window);

    gtk_main();

    return FALSE;
}
回复 支持 反对

使用道具 举报

发表于 2009-12-11 10:55:14 | 显示全部楼层
key-press-event 要返回值
回复 支持 反对

使用道具 举报

发表于 2009-12-11 13:46:09 | 显示全部楼层
楼主的上下文标号是指 IDC_XXX,类似于这样的吧?这个是MFC/wxwidget中使用的方法。gtk中直接操作控件对象。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-12-11 17:54:23 | 显示全部楼层
gboolean key_enter(GtkWidget *widget,GdkEventKey *event,gpointer data)
{
      if(event->keyval==GDK_KP_Enter)
      {
              gtk_widget_grab_focus(data);
              return TRUE;
       }
       else
       {
              return FALSE;
       }
}

我把前面的程序中key_press_event的处理函数改成上面那样可以吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-12-11 17:56:20 | 显示全部楼层
Post by jetking;2054792
楼主的上下文标号是指 IDC_XXX,类似于这样的吧?这个是MFC/wxwidget中使用的方法。gtk中直接操作控件对象。




多谢,我说的上下文标号就是兄台说的那个样子,现在明白了,再次感谢!!!
回复 支持 反对

使用道具 举报

发表于 2009-12-15 11:12:29 | 显示全部楼层
Post by 风云游侠;2054863
gboolean key_enter(GtkWidget *widget,GdkEventKey *event,gpointer data)
{
      if(event->keyval==GDK_KP_Enter)
      {
              gtk_widget_grab_focus(data);
              return TRUE;
       }
       else
       {
              return FALSE;
       }
}

我把前面的程序中key_press_event的处理函数改成上面那样可以吗?


应该可以. 试试看吧.
回复 支持 反对

使用道具 举报

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

本版积分规则

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