gtk 菜单问题

发布于 2022-08-09 18:55:40 字数 56 浏览 7 评论 1

请问如何实现gtk多级菜单的实现?例如file下有open,edit等,而open下还有其他的菜单?该如何实现?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

假面具 2022-08-10 19:56:01

有菜单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);
        }

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文