gtk 菜单问题
请问如何实现gtk多级菜单的实现?例如file下有open,edit等,而open下还有其他的菜单?该如何实现?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
请问如何实现gtk多级菜单的实现?例如file下有open,edit等,而open下还有其他的菜单?该如何实现?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(1)
有菜单gtk_menu和菜单项gtk_menu_item这两种东西。gtk_menu不可见,gtk_menu_item可见。如果要有子菜单,必须定义一个菜单gtk_menu,把子菜单项加进去,再把这个gtk_menu绑定到父菜单项上。给一个例子吧。
#include <gtk/gtk.h>
GtkWidget* form1;
GtkWidget* box1;
GtkWidget* menubar;
GtkWidget* menuitem1;
GtkWidget* menuitem2;
GtkWidget* menuitem3;
GtkWidget* menu1;
GtkWidget* menu2;
GtkWidget* menuitem1_1;
GtkWidget* menuitem1_2;
GtkWidget* menuitem1_3;
GtkWidget* menuitem2_1;
GtkWidget* menuitem2_2;
GtkWidget* menu2_2;
GtkWidget* menuitem2_2_1;
GtkWidget* menuitem2_2_2;
void pt(GtkWidget* w, gpointer p);
int main(int argc, char *argv[])
{gtk_init(&argc,&argv);
form1=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_signal_connect(GTK_OBJECT(form1), "destroy", GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
box1=gtk_vbox_new(FALSE,0);
//建立菜单条并把第一级菜单项放入
menubar=gtk_menu_bar_new();//建立菜单条
menuitem1=gtk_menu_item_new_with_label(" menuitem1 ");//建立菜单项
gtk_menu_bar_append(GTK_MENU_BAR(menubar),menuitem1);//把菜单项加入到菜单条中
menuitem2=gtk_menu_item_new_with_label(" menuitem2 ");
gtk_menu_bar_append(GTK_MENU_BAR(menubar),menuitem2);
menuitem3=gtk_menu_item_new_with_label(" menuitem3 ");
gtk_menu_bar_append(GTK_MENU_BAR(menubar),menuitem3);
//建立menuitem1的子菜单
menu1=gtk_menu_new();//建立菜单
menuitem1_1=gtk_menu_item_new_with_label(" menuitem1_1 ");
gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem1_1);//把菜单项加入到菜单中
menuitem1_2=gtk_menu_item_new_with_label(" menuitem1_2 ");
gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem1_2);
menuitem1_3=gtk_menu_item_new_with_label(" menuitem1_3 ");
gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem1_3);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem1),menu1);//最后把菜单menu1粘到菜单项menuitem1上
//如法炮制menuitem2的子菜单
menu2=gtk_menu_new();
menuitem2_1=gtk_menu_item_new_with_label(" menuitem2_1 ");
gtk_menu_shell_append(GTK_MENU_SHELL(menu2),menuitem2_1);
menuitem2_2=gtk_menu_item_new_with_label(" menuitem2_2 ");
gtk_menu_shell_append(GTK_MENU_SHELL(menu2),menuitem2_2);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem2),menu2);
//如法炮制menuitem2_2的子菜单
menu2_2=gtk_menu_new();
menuitem2_2_1=gtk_menu_item_new_with_label(" menuitem2_2_1 ");
gtk_menu_shell_append(GTK_MENU_SHELL(menu2_2),menuitem2_2_1);
menuitem2_2_2=gtk_menu_item_new_with_label(" menuitem2_2_2 ");
gtk_menu_shell_append(GTK_MENU_SHELL(menu2_2),menuitem2_2_2);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem2_2),menu2_2);
//连接信号和函数
gtk_signal_connect(GTK_OBJECT(menuitem1), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem1"));
gtk_signal_connect(GTK_OBJECT(menuitem2), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem2"));
gtk_signal_connect(GTK_OBJECT(menuitem3), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem3"));
gtk_signal_connect(GTK_OBJECT(menuitem1_1), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem1_1"));
gtk_signal_connect(GTK_OBJECT(menuitem1_2), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem1_2"));
gtk_signal_connect(GTK_OBJECT(menuitem1_3), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem1_3"));
gtk_signal_connect(GTK_OBJECT(menuitem2_1), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem2_1"));
gtk_signal_connect(GTK_OBJECT(menuitem2_2), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem2_2"));
gtk_signal_connect(GTK_OBJECT(menuitem2_2_1), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem2_2_1"));
gtk_signal_connect(GTK_OBJECT(menuitem2_2_2), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem2_2_2"));
gtk_box_pack_start(GTK_BOX(box1),menubar,FALSE,FALSE,0);
gtk_container_add(GTK_CONTAINER(form1),box1);
gtk_window_set_default_size(GTK_WINDOW(form1),400,200);
gtk_widget_show_all(form1);
gtk_main();
return(0);
}
void pt(GtkWidget* w, gpointer p)
{g_print("%sn",(gchar*)p);
}