GTK 不呈现所有用户界面
GTK not rendering all user interfaces
我正在使用 gtk+ 和 c 。我已经创建了菜单栏,现在想附加一个带有一些按钮的 table。我已经编写了所有必要的 API 例程,但是,我面临的问题是,如果我首先创建菜单栏,那么 table 不会呈现为 window,我会先呈现 table在它的位置看不到菜单栏...。我不知道为什么。这是代码
/* 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;
}
问题是您试图将多个子项添加到同一个容器 GtkWindow,而该容器只能容纳一个子项。
您确实创建了一个 vbox,但是在您没有将 GtkTable 添加到 GtkBox 之后,顺便说一句,自 Gtk+ 3.4 以来它已被弃用。
另请注意,您在创建之前将 GtkTable 添加到 window 并且 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
、false
和bool
(由于包含,不确定您使用的是哪个框架)。
完整的源代码是:
/* 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`
我正在使用 gtk+ 和 c 。我已经创建了菜单栏,现在想附加一个带有一些按钮的 table。我已经编写了所有必要的 API 例程,但是,我面临的问题是,如果我首先创建菜单栏,那么 table 不会呈现为 window,我会先呈现 table在它的位置看不到菜单栏...。我不知道为什么。这是代码
/* 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;
}
问题是您试图将多个子项添加到同一个容器 GtkWindow,而该容器只能容纳一个子项。
您确实创建了一个 vbox,但是在您没有将 GtkTable 添加到 GtkBox 之后,顺便说一句,自 Gtk+ 3.4 以来它已被弃用。
另请注意,您在创建之前将 GtkTable 添加到 window 并且 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
、false
和bool
(由于包含,不确定您使用的是哪个框架)。
完整的源代码是:
/* 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`