【问题标题】:Menu doesn't display while creating it in GTK+ 3 C在 GTK+ 3 C 中创建菜单时不显示菜单
【发布时间】:2016-06-20 06:47:12
【问题描述】:

Screenshot of the output

我是 gtk+ 的新手。在学习在 gtk+ 中创建菜单时,我只是复制粘贴以下代码,当我运行它时....我不知道是什么问题,但它只显示窗口。它没有显示任何菜单或菜单栏...如果有人遇到过这个问题,请帮助我...

    #include <gtk/gtk.h>
    GdkPixbuf *create_pixbuf(const gchar * filename)
    {
    GdkPixbuf *pixbuf;
    GError *error = NULL;
    pixbuf = gdk_pixbuf_new_from_file(filename, &error);
    if (!pixbuf) {
    fprintf(stderr, "%s\n", error->message);
    g_error_free(error);
    }
    return pixbuf;
    }

    int main(int argc, char *argv[])
    {

    GtkWidget *window;
    GtkWidget *icon;
    GtkWidget *vbox;

    GtkWidget *menubar;
    GtkWidget *fileMenu;
    GtkWidget *fileMi;
    GtkWidget *quitMi;
    GtkWidget *text_view;
    GtkWidget *buffer;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Write Pad");
    gtk_window_set_default_size(GTK_WINDOW(window), 500, 400);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

    icon = create_pixbuf("Web.png");
    gtk_window_set_icon(GTK_WINDOW(window), icon);

    vbox = gtk_vbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(window), vbox);


    text_view = gtk_text_view_new ();
    gtk_box_pack_start (GTK_BOX (vbox), text_view, 1, 1, 0);

    buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view));



    menubar = gtk_menu_bar_new();
    fileMenu = gtk_menu_new();

    fileMi = gtk_menu_item_new_with_label("File");
    quitMi = gtk_menu_item_new_with_label("Quit");

    gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileMi), fileMenu);
    gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), quitMi);
    gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileMi);
    gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);


    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);

    g_signal_connect(G_OBJECT(quitMi), "activate", G_CALLBACK(gtk_main_quit), NULL);



    gtk_widget_show_all(window);

    gtk_main();

    return 0;
    }

【问题讨论】:

    标签: c gtk stack-overflow text-editor


    【解决方案1】:

    代码存在一些问题。您声明的所有变量都使用GtkWidget * 类型,而函数create_pixbufgtk_text_view_get_buffer 返回GdkPixbuf *GtkTextBuffer * 类型的数据。您还使用了已弃用的函数。

    此外,您在GtkTextView相关函数之后调用菜单相关函数,从而将菜单置于窗口底部。

    这是工作代码:

    #include <gtk/gtk.h>
    
    GdkPixbuf *
    create_pixbuf (const gchar *filename)
    {
        GdkPixbuf *pixbuf;
        GError    *error = NULL;
    
        pixbuf = gdk_pixbuf_new_from_file (filename, &error);
    
        if (!pixbuf) {
            fprintf (stderr, "%s\n", error->message);
            g_error_free (error);
        }
    
        return pixbuf;
    }
    
    int
    main (int argc, char *argv[])
    {
        GtkWidget     *window;
        GdkPixbuf     *icon;
        GtkWidget     *vbox;
    
        GtkWidget     *menubar;
        GtkWidget     *fileMenu;
        GtkWidget     *fileMi;
        GtkWidget     *quitMi;
        GtkWidget     *text_view;
        GtkTextBuffer *buffer;
    
        gtk_init (&argc, &argv);
    
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        icon = create_pixbuf ("Web.png");
    
        gtk_window_set_title (GTK_WINDOW (window), "Write Pad");
        gtk_window_set_default_size (GTK_WINDOW (window), 500, 400);
        gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
        gtk_window_set_icon (GTK_WINDOW (window), icon);
    
        vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
        gtk_container_add (GTK_CONTAINER (window), vbox);
    
        menubar = gtk_menu_bar_new ();
        fileMenu = gtk_menu_new ();
    
        fileMi = gtk_menu_item_new_with_label ("File");
        quitMi = gtk_menu_item_new_with_label ("Quit");
    
        gtk_menu_item_set_submenu (GTK_MENU_ITEM (fileMi), fileMenu);
        gtk_menu_shell_append (GTK_MENU_SHELL (fileMenu), quitMi);
        gtk_menu_shell_append (GTK_MENU_SHELL (menubar), fileMi);
        gtk_box_pack_start (GTK_BOX (vbox), menubar, FALSE, FALSE, 0);
    
        text_view = gtk_text_view_new ();
        gtk_box_pack_start (GTK_BOX (vbox), text_view, TRUE, TRUE, 0);
    
        buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view));
    
        g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
        g_signal_connect (G_OBJECT (quitMi), "activate", G_CALLBACK (gtk_main_quit), NULL);
    
        gtk_widget_show_all (window);
    
        gtk_main ();
    
        return 0;
    }
    

    【讨论】:

    • @SuganGopalNyachhyon 您正在使用 Unity,菜单栏是否显示在系统的顶部面板中?这就是其他 GTK+ 应用程序在 Unity 中放置菜单的地方。您可以尝试在 GNOME 或其他桌面下运行该应用程序,菜单栏应显示在这些桌面环境中。
    • 那里也没有显示
    • @SuganGopalNyachhyon 好吧,它对我有用:i.imgur.com/pOZsH3i.gif你在另一个桌面环境中试过了吗?
    猜你喜欢
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 2011-10-02
    • 2018-08-22
    • 1970-01-01
    相关资源
    最近更新 更多