gtk+について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
x_kai
記事: 29
登録日時: 14年前
連絡を取る:

gtk+について

#1

投稿記事 by x_kai » 13年前

Gtk+でメニューバーを作成してみたのですが、
どうも、実行時にエラーが出ます。

ソースはいかのとおりです。

コード:

#include <gtk/gtk.h>

static GtkActionEntry entries[] = {
    {"FileMenu", NULL, "_File"},
    {"EditMenu", NULL, "_Edit"},
    {"ViewMenu", NULL, "_View"},
    {"SortMenu", GTK_STOCK_SORT_ASCENDING, "Sort by ..."},
    {"New",  NULL, "_New", "<control>N", "Create a new file", NULL},
    {"Open", NULL, "_Open", "<control>O", "Open a file", NULL},
    {"Save", NULL, "_Save", "<control>S", "Save a file", NULL},
    {"SaveAs", NULL, "Save as", "<shift><control>S", NULL, NULL},
    {"Quit", NULL, "_Quit", "<control>Q", "QuitÃaÃprogram" ,gtk_main_quit},
    {"Cut", GTK_STOCK_CUT, "C_ut", "<control>X", NULL, NULL},
    {"Copy" , GTK_STOCK_COPY, "_Copy", "<control>C", NULL,  NULL},
    {"Paste" , GTK_STOCK_PASTE, "_Paste", "<control>V" , NULL, NULL},
    {"Delete" , GTK_STOCK_DELETE, "_Delete", "<control>D", NULL, NULL}
};

static GtkToggleActionEntry toggle_entries[] = {
    {"ShowHidden", NULL, "Show Hidden Folders", "<control>H",
                   NULL, NULL, FALSE}
};

enum {
    SORT_FILE_TYPE,
    SORT_FILE_SIZE,
    SORT_UPDATE_TIME,
};

static GtkRadioActionEntry radio_entries[] = {
    {"FileType", NULL, "File Type", NULL, NULL, SORT_FILE_TYPE },
    {"FileSize", NULL, "File Size", NULL, NULL, SORT_FILE_SIZE },
    {"UpdateTime", NULL, "Update Time", NULL, NULL, SORT_UPDATE_TIME }
};

static guint n_entries        = G_N_ELEMENTS(entries);
static guint n_toggle_entries = G_N_ELEMENTS(toggle_entries);
static guint n_radio_entries  = G_N_ELEMENTS(radio_entries);

static const gchar *ui_info =
    "<ui>"
    "   <menubar name='MenuBar'>"
    "       <menu action='FileMenu'>"
    "           <menuitem action='New' />"
    "           <menuitem action='Open'/>"
    "           <menuitem action='Save'/>"
    "           <menuitem action='SaveAs' />"
    "           <separator/>"
    "           <menuitem action='Quit' />"
    "       </menu>"
    "       <menu action='EditMenu'>"
    "           <menuitem action='Cut'   />"
    "           <menuitem action='Copy'  />"
    "           <menuitem action='Paste' />"
    "           <menuitem action='Delete'/>"
    "       </menu>"
    "       <menu action='ViewMenu'>"
    "           <menuitem action='ShowHidden'/>"
    "           <menu action='SortMenu'>"
    "               <menuitem action='FileType'/>"
    "               <menuitem action='FileSize'/>"
    "               <menuitem action='UpdateTime'/>"
    "           </menu>"
    "       </menu>"
    "   </menubar>"
    "</ui>";

static void activate_radio_action(GtkAction      *action,
                                  GtkRadioAction *current){
    g_print("Radio action \"%s\" selected\n",
        gtk_action_get_name(GTK_ACTION(current)));
}

static GtkWidget *create_menu(GtkWidget *parent){
    GtkUIManager   *ui;
    GtkActionGroup *actions;
    
    actions = gtk_action_group_new("Actions");
    gtk_action_group_add_actions(actions, entries, n_entries, NULL);
    gtk_action_group_add_toggle_actions(actions, toggle_entries,
                                       n_toggle_entries, NULL);
    
    gtk_action_group_add_radio_actions(actions, radio_entries,
                                       n_radio_entries,SORT_FILE_TYPE,
                                       G_CALLBACK(activate_radio_action), NULL);
    
    ui = gtk_ui_manager_new();
         gtk_ui_manager_insert_action_group(ui, actions, 0);
         gtk_ui_manager_set_add_tearoffs(ui, TRUE);
         gtk_window_add_accel_group(GTK_WINDOW(parent),
                                    gtk_ui_manager_get_accel_group(ui));
         gtk_ui_manager_add_ui_from_string(ui, ui_info, -1, NULL);
    
    return gtk_ui_manager_get_widget(ui, "/MenuBar");
}

int main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *menubar;
    GtkWidget *lunch, *lunchmenu,*vbox;
    GtkWidget *menu1, *menu2, *menu3;
    
    gtk_init(&argc, &argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(window), "Tinytole Terminal");
        gtk_widget_set_size_request(window, 580 , 370);
        gtk_container_set_border_width(GTK_CONTAINER(window), 0);
        
        g_signal_connect(G_OBJECT(window), "destroy",
                         G_CALLBACK(gtk_main_quit), NULL);
        
            vbox = gtk_vbox_new(FALSE, 0);
            menubar = create_menu(window);
                gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
                gtk_box_pack_start(GTK_BOX(vbox), menubar, TRUE, TRUE, 0);
                gtk_container_add(GTK_CONTAINER(window), vbox);
      
    gtk_widget_show_all(window);
    gtk_main();
    
    return 0;
}
エラーはこのようになっています。
(a.out:5302): Gtk-CRITICAL **: gtk_box_pack: assertion `child->parent == NULL' failed

gtk+についてはよく分からないので、分かる方は教えてください。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: gtk+について

#2

投稿記事 by softya(ソフト屋) » 13年前

すいません私も詳しくないのでソース行のコメントをお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
沖 滉均
記事: 237
登録日時: 14年前
住所: K県F市

Re: gtk+について

#3

投稿記事 by 沖 滉均 » 13年前

もしかしたら、質問者さんもう見てないかもと思いつつ
ちょっとgtkはあまり詳しくありませんが、原因は115・116行の2行じゃないでしょうか?
これは、どちらもvboxにmenubarを追加しているように見えるのですが、両方必要でしょうか?

コード:

                gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
                gtk_box_pack_start(GTK_BOX(vbox), menubar, TRUE, TRUE, 0);
と、書いた所で実行してみたところ115行目だけで良さそうですね。
tkと似たような感じなので、vboxがmenubarを1つしか持つことができないのに、複数packしようとしているからエラーが発生しているように見えます。
There is no royal road to learning.
codeタグで指定できる言語
画像

閉鎖

“C言語何でも質問掲示板” へ戻る