2017-12-21 10 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

문제는 하나 이상의 자식 만 저장할 수있는 동일한 컨테이너 인 GtkWindow에 자식 이상을 추가하려고하는 것입니다.

당신은 vbox를 만들었지 만 GtkTable을 GtkBox에 추가하지 않았다. GtkTable은 Gtk + 3.4부터 사용되지 않으므로 GtkBox에 추가되지 않았다.

또한 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// 

} 

우리는 ((가) 포함으로 인해, 확실하지 않은 어떤 프레임 워크를 사용하는) true, falsebool 정의했다.

전체 소스 코드는 다음과 같습니다

/* 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 작품 !!하지만 컨테이너에 자식 하나만 만들 수 있다는 것을 이해하지 못합니다. 그리고 vbox에 연결하면 새 vbox 요소가 생성되지 않고 어떻게 첨부되어 있습니까? 여기에 vbox가 참조 또는 다른 것으로 작동합니다. –

+0

아니요, 그건 제가 말한 것이 아닙니다. Gtk.Window는 하나의 자식 만 처리 할 수있는 컨테이너입니다. Gtk.Box는 ** 하나 이상의 컨테이너를 담을 수있는 또 다른 컨테이너입니다. GtkBox, GtkGrid, GtkFixed, GtkLayout, GtkListBox, GtkFlowBox 등과 같은 다른 것들은 하나 이상의 자식을 포장 할 수 있지만, 하나의 자식 만 포장하는 이러한 컨테이너는 단순한 컨테이너입니다. 이것은 Gtk에서 사용하는 일반적인 "상자 안쪽 상자"모델입니다 (GtkFixed/GtkLayout은 고정 위치/크기 조정을 사용하지만 또 다른 문제입니다). GtkBox를 GtkWindow에 추가했을 때 이미 컨테이너를 채웠습니다. –

+0

이것이 GtkBox가 GtkBox를 갖고있는 이유입니다. GtkBox는 더 많은 GtkBox를 포함하여 많은 하위 항목을 세로 또는 가로로 묶을 수 있습니다. 또 다른 것은 GtkBoxes가 "on-the-fly"로 만들어지지 않는다는 것입니다. 그런 다음 다른 위젯을 패킷으로 만들고 그 위젯을 하나 이상의 컨테이너에 포장 할 수 없습니다! GtkListBox와 같은 일부 GtkContainer는 자동으로 GtkListBoxRows를 만들 수 있지만 혼란스럽게하지 마십시오. 가지고있는 것은'GtkWindow> GtkBox> GMenu + GtkTable입니다. 자신의 코드를 읽고 그것을 이해하려고 노력하십시오. 행운을 빕니다! –

관련 문제