以下gtk+编程例子是来自书籍《实用技术:开发Linux应用——用GTK+和GDK开发Linux图形用户界面应用》第70页的内容——快捷键,主要是参考gtk3-demo中Builder例子中的源代码,暂时也不知如何实现Ctrl+Shift组合键
在openSUSE-Leap-15.3-DVD-x86_64的gnome3.34.7桌面环境下编译的,其中pkg-config --cflags --libs gtk±3.0两边有反引号括起来的
ruhong@localhost:~/gtk> gcc page70.c -o page70 pkg-config --cflags --libs gtk±3.0
ruhong@localhost:~/gtk> ./page70
/* the example on page 70 */
#include <gtk/gtk.h>
/* 准备材料,自定义函数 */
/* comments注释 */
void shortcut_key_action (GtkWidget *widget, gpointer *data)
{
g_print ("当你按下组合键 %s 时,在终端能看到此条信息表明组合键已经产生动作了\n", data);
}
/* 正常情况下当你按下组合键会跳出一个对话框的,但是这只是一个小程序并没有完善,为了显示你按下组合键的结果,就简单地在终端能看到此条信息表明组合键已经产生动作了,这个动作与你使用鼠标点击命令是一样的 */
/* 程序主体 */
int main( int argc, char *argv[] )
{
GtkWidget *window;
/* 声明变量window为构件gtkwidget */
GtkAccelGroup *accel_group;
/* 声明变量accel_group为快捷键组GtkAccelGroup类型 */
GtkWidget *vbox;
GtkWidget *menubar;
GtkWidget *file;
GtkWidget *edit;
GtkWidget *help;
GtkWidget *filemenu;
GtkWidget *new;
GtkWidget *open;
GtkWidget *save;
GtkWidget *save_as;
GtkWidget *separator;
GtkWidget *quit;
GtkWidget *editmenu;
GtkWidget *copy;
GtkWidget *cut;
GtkWidget *paste;
GtkWidget *find;
GtkWidget *replace;
GtkWidget *helpmenu;
GtkWidget *helpf1;
GtkWidget *aboutf7;
gtk_init (&argc, &argv);
/* 初始化gtk */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
/* 创建顶级窗口 */
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
/* 设置窗口位置为显示器的中间 */
gtk_window_set_default_size(GTK_WINDOW(window), 500, 200);
/* 设置窗口的大小,横为500像素,竖为200像素 */
gtk_window_set_title (GTK_WINDOW (window), "常用快捷键");
/* 为窗口顶部加上标题为常用快捷键 */
g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
/* 为窗口加上动作,当收到destroy信号,就启动gtk_main_quit事件,gtk_main_quit就是鼠标单击窗口右上角的关闭按钮就终止程序 */
accel_group = gtk_accel_group_new ();
/* 创建快捷键组accel_group */
gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
/* 将快捷键组装入窗口容器 */
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
/* 创建组合框 */
gtk_container_add (GTK_CONTAINER (window), vbox);
/* 将组合框装入窗口容器 */
menubar = gtk_menu_bar_new ();
/* 创建菜单条 */
gtk_box_pack_start (GTK_BOX (vbox), menubar, FALSE, TRUE, 0);
/* 将菜单条装入组合框容器 */
file = gtk_menu_item_new_with_label ("文件");
/* 创建名称文件 */
gtk_menu_shell_append (GTK_MENU_SHELL(menubar), file);
/* 将名称file加入菜单条menubar */
edit = gtk_menu_item_new_with_label ("编辑");
gtk_menu_shell_append (GTK_MENU_SHELL(menubar), edit);
help = gtk_menu_item_new_with_label ("帮助");
gtk_menu_shell_append (GTK_MENU_SHELL(menubar), help);
filemenu = gtk_menu_new ();
/* 类似创建文件菜单组 */
gtk_menu_item_set_submenu (GTK_MENU_ITEM (file), filemenu);
new = gtk_menu_item_new_with_label ("新建");
/* 创建名称新建new */
gtk_menu_shell_append (GTK_MENU_SHELL (filemenu), new);
/* 将名称新建new加入文件菜单组filemenu */
g_signal_connect(G_OBJECT(new), "activate", G_CALLBACK(shortcut_key_action), "ctrl-n新建");
/* 为new构件加上鼠标点击动作,当鼠标点击new构件时,就启动shortcut_key_action事件,shortcut_key_action就是在终端显示一条信息表明鼠标点击产生结果了 */
gtk_widget_add_accelerator (new, "activate", accel_group, GDK_KEY_n, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
/* 为new构件加上快捷组合键动作,当在键盘上按下new构件的组合键ctrl-n新建时,就启动shortcut_key_action事件,shortcut_key_action就是在终端显示一条信息表明快捷组合键产生结果了 */
open = gtk_menu_item_new_with_label ("打开");
gtk_menu_shell_append (GTK_MENU_SHELL (filemenu), open);
g_signal_connect(G_OBJECT(open), "activate", G_CALLBACK(shortcut_key_action), "ctrl-o打开");
gtk_widget_add_accelerator (open, "activate", accel_group, GDK_KEY_o, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
save = gtk_menu_item_new_with_label ("保存");
gtk_menu_shell_append (GTK_MENU_SHELL (filemenu), save);
g_signal_connect(G_OBJECT(save), "activate", G_CALLBACK(shortcut_key_action), "ctrl-s保存");
gtk_widget_add_accelerator (save, "activate", accel_group, GDK_KEY_s, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
save_as = gtk_menu_item_new_with_label ("另存为");
gtk_menu_shell_append (GTK_MENU_SHELL (filemenu), save_as);
g_signal_connect(G_OBJECT(save_as), "activate", G_CALLBACK(shortcut_key_action), "shift-s另存为");
gtk_widget_add_accelerator (save_as, "activate", accel_group, GDK_KEY_s, GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE);
/* 查网上说GDK_MOD1_MASK表示ctrl+shift组合,但经试验是没有结果的,还不知如何实现,暂时只用shift+s代替 */
separator = gtk_separator_menu_item_new ();
/* 创建分隔条separator,就是纯粹一条线而已 */
gtk_menu_shell_append (GTK_MENU_SHELL (filemenu), separator);
quit = gtk_menu_item_new_with_label ("退出");
gtk_menu_shell_append (GTK_MENU_SHELL (filemenu), quit);
g_signal_connect(G_OBJECT(quit), "activate", G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_add_accelerator (quit, "activate", accel_group, GDK_KEY_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
editmenu = gtk_menu_new ();
gtk_menu_item_set_submenu (GTK_MENU_ITEM (edit), editmenu);
copy = gtk_menu_item_new_with_label ("复制");
gtk_menu_shell_append (GTK_MENU_SHELL (editmenu), copy);
g_signal_connect(G_OBJECT(copy), "activate", G_CALLBACK(shortcut_key_action), "ctrl-c复制");
gtk_widget_add_accelerator (copy, "activate", accel_group, GDK_KEY_c, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
cut = gtk_menu_item_new_with_label ("剪切");
gtk_menu_shell_append (GTK_MENU_SHELL (editmenu), cut);
g_signal_connect(G_OBJECT(cut), "activate", G_CALLBACK(shortcut_key_action), "ctrl-x剪切");
gtk_widget_add_accelerator (cut, "activate", accel_group, GDK_KEY_x, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
paste = gtk_menu_item_new_with_label ("粘贴");
gtk_menu_shell_append (GTK_MENU_SHELL (editmenu), paste);
g_signal_connect(G_OBJECT(paste), "activate", G_CALLBACK(shortcut_key_action), "ctrl-v粘贴");
gtk_widget_add_accelerator (paste, "activate", accel_group, GDK_KEY_v, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
find = gtk_menu_item_new_with_label ("查找");
gtk_menu_shell_append (GTK_MENU_SHELL (editmenu), find);
g_signal_connect(G_OBJECT(find), "activate", G_CALLBACK(shortcut_key_action), "ctrl-f查找");
gtk_widget_add_accelerator (find, "activate", accel_group, GDK_KEY_f, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
replace = gtk_menu_item_new_with_label ("替换");
gtk_menu_shell_append (GTK_MENU_SHELL (editmenu), replace);
g_signal_connect(G_OBJECT(replace), "activate", G_CALLBACK(shortcut_key_action), "ctrl-h替换");
gtk_widget_add_accelerator (replace, "activate", accel_group, GDK_KEY_h, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
helpmenu = gtk_menu_new ();
gtk_menu_item_set_submenu (GTK_MENU_ITEM (help), helpmenu);
helpf1 = gtk_menu_item_new_with_label ("帮助F1");
gtk_menu_shell_append (GTK_MENU_SHELL (helpmenu), helpf1);
g_signal_connect(G_OBJECT(helpf1), "activate", G_CALLBACK(shortcut_key_action), "F1帮助");
gtk_widget_add_accelerator (helpf1, "activate", accel_group, GDK_KEY_F1, 0, GTK_ACCEL_VISIBLE);
aboutf7 = gtk_menu_item_new_with_label ("关于我F7");
gtk_menu_shell_append (GTK_MENU_SHELL (helpmenu), aboutf7);
g_signal_connect(G_OBJECT(aboutf7), "activate", G_CALLBACK(shortcut_key_action), "F7关于我");
gtk_widget_add_accelerator (aboutf7, "activate", accel_group, GDK_KEY_F7, 0, GTK_ACCEL_VISIBLE);
gtk_widget_show_all (window);
/* 显示构件窗口包括所有构件 */
gtk_main ();
/* 进入主循环,等待信号(鼠标键盘)输入 */
return 0;
}
效果图如下