2017-12-21 11 views
1

gtk +とcを使用しています。私はメニューバーを作成し、いくつかのボタンでテーブルをアタッチしたい。私はすべての不可欠なAPIルーチンを書いていますが、私が直面している問題は、最初にメニューバーを作成するとテーブルがウィンドウにレンダリングされず、テーブルの最初のメニューバーがその場所に表示されません。なぜ。ここにコードがありますGTKがすべてのユーザーインターフェイスを表示しない

/* Button Boxes 
* 
* The Button Box widgets are used to arrange buttons with padding. 
*/ 
#include <gtk/gtk.h> 


GtkWidget *window,*button,*container,*menubar,*fileM,*menu,*vbox,*aboutM,*quitM,*bdrM; 
GtkWidget *image,*table,*Fileframe,*framecnt; 
bool status=false; 

void aboutDialog() 
{ 
    GtkWidget *box; 
    box=gtk_message_dialog_new(GTK_WINDOW(window),GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_INFO,GTK_BUTTONS_OK,"EXAMPLE");; 
    gtk_dialog_run(GTK_DIALOG(box)); 
    gtk_widget_destroy(box); 

} 

void Warning_quit() 
{ 
    GtkWidget *box; 
    box=gtk_message_dialog_new(GTK_WINDOW(window),GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_WARNING,GTK_BUTTONS_YES_NO,"Sure want to quit.."); 
    gtk_dialog_run(GTK_DIALOG(box)); 
    gtk_widget_destroy(box); 
    gtk_main_quit(); 

} 

void toggle_Border() 
{ 
    if(status==false) 
    { 
     gtk_window_set_decorated(GTK_WINDOW(window),true); 
     gtk_menu_item_set_label(GTK_MENU_ITEM(bdrM),"fix"); 
     status=true; 
    } 
    else if(status==true) 
    { 
     gtk_window_set_decorated(GTK_WINDOW(window),false); 
     gtk_menu_item_set_label(GTK_MENU_ITEM(bdrM),"move"); 
     status=false; 

    } 

} 
void initDecoration() 
{ 
    vbox=gtk_vbox_new(false,0); 
    menubar=gtk_menu_bar_new(); 
    fileM=gtk_menu_item_new_with_label("file"); 
    aboutM=gtk_menu_item_new_with_label("about"); 
    quitM=gtk_menu_item_new_with_label("quit"); 
    bdrM=gtk_menu_item_new_with_label("move"); 
    menu=gtk_menu_new(); 
    //////////////////////// 
    gtk_container_add(GTK_CONTAINER(window),vbox);//attach vbox with window.. 
    gtk_menu_shell_append(GTK_MENU_SHELL(menubar),fileM);//attach menu into menubar 
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileM),menu); 
    gtk_menu_shell_append(GTK_MENU_SHELL(menu),aboutM); 
    gtk_menu_shell_append(GTK_MENU_SHELL(menubar),bdrM); 
    gtk_menu_shell_append(GTK_MENU_SHELL(menu),quitM);//attach quit menu with menu.. 
    gtk_box_pack_start(GTK_BOX(vbox),menubar,0,0,1);//attach menubar with vbox// 

    //attach signal intrrupt for menus.. 
    g_signal_connect(G_OBJECT(aboutM),"activate",G_CALLBACK(aboutDialog),0);//signal for about menu.. 
    g_signal_connect(G_OBJECT(quitM),"activate",G_CALLBACK(Warning_quit),0);//signal for quit menu.. 
    g_signal_connect(G_OBJECT(bdrM),"activate",G_CALLBACK(toggle_Border),0); 
} 

void initTable() 
{ 
    GtkWidget *button; 
    gtk_container_add(GTK_CONTAINER(window),table); //table attached to main window.. 
    button=gtk_button_new_with_label("button"); 
    table=gtk_table_new(4,4,true); //table created.. 
    gtk_table_attach_defaults(GTK_TABLE(table),button,0,1,0,1); //attaching frame container to table cell.. 

} 
int main(int argc, char *argv[]) 
{ 
    gtk_init(&argc, &argv); 
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); 
    gtk_window_set_default_size(GTK_WINDOW(window), 250, 200); 
    //setup menubar; 
    initDecoration(); 
    initTable(); 
    g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),0); 
    gtk_widget_show_all(window); 
    gtk_main(); 

    return 0; 
} 
+1

引数を取らない関数は '(ボイド)' Cにおいて、括弧の空の一対の推奨ものではありませんつかいます。 – unwind

+0

あなたは私のコードを実行しています.. –

+1

@ ShivanshuRaj私はそれを実行しています。 true、false、およびboolを定義しなければ、コンパイルできませんでした。達成すべきことは何ですか? –

答えて

1

問題は、1つの子を保持できるGtkWindowと同じコンテナに複数の子を追加しようとしているということです。

あなたはvboxを作成しましたが、GtkTableをGtkBoxに追加しませんでした.GtkTableはGtk + 3.4以降では推奨されていません。

作成する前にGtkTableをウィンドウに追加していて、GtkWindowがそれに不平を言うことにも注意してください。

だから、あなたのinitTable機能は次のようになります。

void initTable() 
{ 
    GtkWidget *button; 
    button=gtk_button_new_with_label("button"); 
    table=gtk_table_new(4,4,true); //table created.. 
    gtk_table_attach_defaults(GTK_TABLE(table),button,0,1,0,1); //attaching frame container to table cell.. 

    gtk_box_pack_start(GTK_BOX(vbox),table,0,0,1);//attach menubar with vbox// 

} 

我々は(これは、使用しているフレームワークの確認、ない含んに)truefalseboolを定義しなければならなかったコンパイルするために。

完全なソースコードは次のとおり

でコンパイル
/* Button Boxes 
* 
* The Button Box widgets are used to arrange buttons with padding. 
*/ 
#include <gtk/gtk.h> 

#define true TRUE 
#define false FALSE 
#define bool gboolean 

GtkWidget *window,*button,*container,*menubar,*fileM,*menu,*vbox,*aboutM,*quitM,*bdrM; 
GtkWidget *image,*table,*Fileframe,*framecnt; 
bool status=false; 

void aboutDialog() 
{ 
    GtkWidget *box; 
    box=gtk_message_dialog_new(GTK_WINDOW(window),GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_INFO,GTK_BUTTONS_OK,"EXAMPLE");; 
    gtk_dialog_run(GTK_DIALOG(box)); 
    gtk_widget_destroy(box); 

} 

void Warning_quit() 
{ 
    GtkWidget *box; 
    box=gtk_message_dialog_new(GTK_WINDOW(window),GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_WARNING,GTK_BUTTONS_YES_NO,"Sure want to quit.."); 
    gtk_dialog_run(GTK_DIALOG(box)); 
    gtk_widget_destroy(box); 
    gtk_main_quit(); 

} 

void toggle_Border() 
{ 
    if(status==false) 
    { 
     gtk_window_set_decorated(GTK_WINDOW(window),true); 
     gtk_menu_item_set_label(GTK_MENU_ITEM(bdrM),"fix"); 
     status=true; 
    } 
    else if(status==true) 
    { 
     gtk_window_set_decorated(GTK_WINDOW(window),false); 
     gtk_menu_item_set_label(GTK_MENU_ITEM(bdrM),"move"); 
     status=false; 

    } 

} 
void initDecoration() 
{ 
    vbox=gtk_vbox_new(false,0); 
    menubar=gtk_menu_bar_new(); 
    fileM=gtk_menu_item_new_with_label("file"); 
    aboutM=gtk_menu_item_new_with_label("about"); 
    quitM=gtk_menu_item_new_with_label("quit"); 
    bdrM=gtk_menu_item_new_with_label("move"); 
    menu=gtk_menu_new(); 
    //////////////////////// 
    gtk_container_add(GTK_CONTAINER(window),vbox);//attach vbox with window.. 
    gtk_menu_shell_append(GTK_MENU_SHELL(menubar),fileM);//attach menu into menubar 
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileM),menu); 
    gtk_menu_shell_append(GTK_MENU_SHELL(menu),aboutM); 
    gtk_menu_shell_append(GTK_MENU_SHELL(menubar),bdrM); 
    gtk_menu_shell_append(GTK_MENU_SHELL(menu),quitM);//attach quit menu with menu.. 
    gtk_box_pack_start(GTK_BOX(vbox),menubar,0,0,1);//attach menubar with vbox// 

    //attach signal intrrupt for menus.. 
    g_signal_connect(G_OBJECT(aboutM),"activate",G_CALLBACK(aboutDialog),0);//signal for about menu.. 
    g_signal_connect(G_OBJECT(quitM),"activate",G_CALLBACK(Warning_quit),0);//signal for quit menu.. 
    g_signal_connect(G_OBJECT(bdrM),"activate",G_CALLBACK(toggle_Border),0); 
} 

void initTable() 
{ 
    GtkWidget *button; 
    button=gtk_button_new_with_label("button"); 
    table=gtk_table_new(4,4,true); //table created.. 
    gtk_table_attach_defaults(GTK_TABLE(table),button,0,1,0,1); //attaching frame container to table cell.. 

    gtk_box_pack_start(GTK_BOX(vbox),table,0,0,1);//attach menubar with vbox// 

} 
int main(int argc, char *argv[]) 
{ 
    gtk_init(&argc, &argv); 
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); 
    gtk_window_set_default_size(GTK_WINDOW(window), 250, 200); 
    //setup menubar; 
    initDecoration(); 
    initTable(); 
    g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),0); 
    gtk_widget_show_all(window); 
    gtk_main(); 

    return 0; 
} 

gcc -o main main.c `pkg-config --cflags --libs gtk+-3.0` 
+0

返信いただきありがとうございます.it作品!!しかし私はコンテナに子を1つしか作成できないことを理解していませんし、vboxに接続すると新しいvbox要素は作成されませんでした。ここのvboxは参考資料などとして動作しています –

+0

いいえ、それは私が言ったことではありません。 Gtk.Windowは、1つの子を扱うことができるコンテナです。 Gtk.Boxは、**複数の子を保持できる別の種類のコンテナです。 GtkBox、GtkGrid、GtkLixout、GtkLayout、GtkListBox、GtkFlowBoxなどのようなものは、複数の子供をパックすることができます。これは、Gtkが使用する通常の "ボックス内箱"モデルです(GtkFixed/GtkLayoutは固定位置/サイズを使用しますが、それは別の問題です)。したがって、GtkBoxをGtkWindowに追加したときに、そのコンテナを既に埋め込んでいます。 –

+0

これは、GtkBoxがGtkBoxを持っている理由です.GtkBoxは、GtkBoxを含む、多くの子を、垂直または水平にパックすることができます。もう1つのことは、GtkBoxesが "オンザフライ"で作成されていないことです。その中に他のウィジェットを作成してパケット化し、その1つのコンテナにウィジェットをパックすることはできません。 GtkListBoxのような一部のGtkContainerは、自動的にGtkListBoxRowsを作成できますが、混乱させません。あなたが持っているのは 'GtkWindow> GtkBox> GMenu + GtkTableです。自分のコードを読んで理解してみてください。がんばろう! –

関連する問題