第70页的gtk+编程例子——快捷键

该博客介绍了在openSUSE Leap 15.3环境下,使用GTK+ 3.0库进行图形用户界面开发的过程。通过一个实际的C语言代码示例,展示了如何创建一个包含菜单和快捷键功能的应用程序。开发者尝试实现Ctrl+Shift组合键,但目前仅实现了Shift+S作为替代。程序在终端中显示快捷键激活的信息,为用户提供了一种交互方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下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;
}

效果图如下
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值