GTK+中为控件设置窗体级热键


方法很简单,下面以给Gtkbutton设置热键为例。

首先介绍要用到的两个函数:
void                gtk_widget_add_accelerator          (GtkWidget *widget,
                                                         const gchar *accel_signal,
                                                         GtkAccelGroup *accel_group,
                                                         guint accel_key,
                                                         GdkModifierType accel_mods,
                                                         GtkAccelFlags accel_flags);

参数介绍:

    widget:        需要帮定热键的控件     我们这里是button1
    accel_signal :      按下热键后要激活的控件的信号     我们这里是“clicked”
    accel_group :     指定一个accel group,这个 accel group将被分配给TopLevel的控件 (主窗体)
    accel_key :       GDK键值   我们要分配的热键    这里是‘E’键
    accel_mods :     组合键(Shift Ctrl之类的)
    accel_flags :       设为GTK_ACCEL_VISIBLE

void                gtk_window_remove_accel_group       (GtkWindow *window,
                                                         GtkAccelGroup *accel_group);

将一个GtkAccelGroup加入到窗体中。

 
下面给我们的button1加上热键:
/**//*注意~!
 GDK的键值宏GDK_E包含在<gdk/gdkkeysyms.h>中  我们需要在开头

#include  <gdk/gdkkeysyms.h>

*/

GtkWidget *mainWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); //要是TOPLEVEL的

GtkWidget *button1= gtk_button_new();

//新建一个GtkAccelGroup
GtkAccelGroup *gag = gtk_accel_group_new();

//设置热键  (不需要组合键,所以accel_mods设为0)
gtk_widget_add_accelerator(button1,"clicked",gag,GDK_E,0,GTK_ACCEL_VISIBLE);

//将GtkAccelGroup设置给主窗体
gtk_window_add_accel_group(GTK_WINDOW(mainWindow),gag);



上面的代码片段就完成了热键的设置,启动你的窗体试试吧。

 

 

另外,对 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 生成的window的许多事件都不能使用 gtk_widget_add_accelerator() ,但是对于 gtk_button_new的可以对"clicked"等事件设置快捷键 应当这样来:

GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
GtkAccelGroup *accel = gtk_accel_group_new();
GClosure *closure = g_cclosure_new (G_CALLBACK (foo), NULL , NULL); gtk_accel_group_connect (accel, GDK_q , 0, GTK_ACCEL_VISIBLE, closure); gtk_window_add_accel_group(GTK_WINDOW(window),accel);

还有个问题,如何给foo() 传递 user_data, 似乎直接传不行

你可能感兴趣的:(gtk)