方法很简单,下面以给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, 似乎直接传不行