我正在用GTK + 2构建一个简单的应用程序,并且有一个带有项目的典型“编辑”菜单;撤消,重做,剪切,复制和粘贴。我这样创建我的“编辑”菜单(为冗长而道歉):
GtkWidget* get_editmenu(GtkWidget *window)
{
GtkWidget
*menu,
*menuitem,
*item
;
GtkAccelGroup *group;
menu = gtk_menu_new();
group = gtk_accel_group_new();
gtk_menu_set_accel_group(GTK_MENU(menu), group);
gtk_window_add_accel_group(GTK_WINDOW(window), group);
menuitem = gtk_menu_item_new_with_label("Edit");
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu);
item = gtk_image_menu_item_new_from_stock(GTK_STOCK_UNDO, group);
g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(on_undo), NULL);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
item = gtk_image_menu_item_new_from_stock(GTK_STOCK_REDO, group);
g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(on_redo), NULL);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
item = gtk_image_menu_item_new_from_stock(GTK_STOCK_COPY, group);
g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(on_copy), NULL);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
item = gtk_image_menu_item_new_from_stock(GTK_STOCK_CUT, group);
g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(on_cut), NULL);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
item = gtk_image_menu_item_new_from_stock(GTK_STOCK_PASTE, group);
g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(on_paste), NULL);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
return menuitem;
}
此功能仅返回顶层菜单项(即“编辑”项),然后将其添加到我的菜单栏中:
GtkWidget* get_menubar(GtkWidget *window)
{
GtkWidget *menubar;
menubar = gtk_menu_bar_new();
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), get_filemenu(window));
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), get_editmenu(window));
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), get_helpmenu(window));
return menubar;
}
这很好。我的加速器适用于Ctrl + O(打开文件),Ctrl + Q(退出应用程序),Ctrl + C(复制)等。但是,执行Ctrl + Z不会触发撤消回调,Ctrl也不会+ Shift + Z重做。当我通过打开“编辑”菜单并通过单击选择它们来手动触发它们时,就可以很好地触发我的回调。
如何使用Ctrl + Z和Ctrl + Shift + Z激活撤消和重做项目?