2012-04-21 2 views
1

У меня есть этот код:GTK сетки добавить два виджета

/* Descrizione: GUI Client FTP sviluppato come progetto per il corso di Reti di Calcolatori (laurea SSRI presso DTI Crema) 
* Sviluppatori: Paolo Stivanin, Filippo Roncari, Stefano Agostini. 
* Anno: 2012 
* Licenza: GNU AGPL v3 <http://www.gnu.org/licenses/agpl-3.0.html> 
* Sito web: <https://github.com/polslinux/FTPUtils> */ 

#include <gtk/gtk.h> 

/* When "connect" button is clicked a message will appear */ 
static void print_hello (GtkWidget *widget, gpointer data) 
{ 
    g_print ("Connect button clicked\n"); 
} 

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

/* Declare widgets */ 
GtkWidget *window; 
GtkWidget *grid; 
GtkWidget *button; 
GtkWidget *u_name; 
GtkWidget *h_name; 
GtkWidget *pass; 
GtkWidget *label_user; 
GtkWidget *label_host; 
GtkWidget *label_pass; 

/*This is called in all GTK applications. Arguments are parsed from the command line and are returned to the application.*/ 
gtk_init (&argc, &argv); 

/* create a new window, set its title and put it on center */ 
window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
gtk_window_set_title (GTK_WINDOW (window), "FTP Client"); 
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); 
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); 
gtk_container_set_border_width (GTK_CONTAINER (window), 10); 
gtk_window_set_resizable(GTK_WINDOW(window), FALSE); /* window is NOT resizable */ 

/* Here we construct the container that is going pack our buttons */ 
grid = gtk_grid_new(); 
gtk_grid_set_row_spacing (GTK_GRID (grid), 3); 

/* Pack the container in the window */ 
gtk_container_add (GTK_CONTAINER (window), grid); 

/* Add labels */ 
label_user = gtk_label_new("Username "); 
label_host = gtk_label_new("Hostname "); 
label_pass = gtk_label_new("Password "); 

/* Add hostname entry and label */ 
h_name = gtk_entry_new(); 
gtk_entry_set_placeholder_text (GTK_ENTRY (h_name), "Hostname"); /* imposto il testo trasparente che scompare quando clicco o scrivo */ 
gtk_grid_attach (GTK_GRID (grid), label_host, 0, 0, 1, 1); 
gtk_grid_attach (GTK_GRID (grid), h_name, 1, 0, 1, 1); 

/* Add username entry and label */ 
u_name = gtk_entry_new(); 
gtk_entry_set_placeholder_text (GTK_ENTRY (u_name), "Username"); 
gtk_grid_attach (GTK_GRID (grid), label_user, 0, 1, 1, 1); 
gtk_grid_attach (GTK_GRID (grid), u_name, 1, 1, 2, 1); 

/* Add password entry and label (visibility set to 0 = not visible */ 
pass = gtk_entry_new(); 
gtk_entry_set_placeholder_text (GTK_ENTRY (pass), "Password"); 
gtk_grid_attach (GTK_GRID (grid), label_pass, 0, 2, 1, 1); 
gtk_entry_set_visibility (GTK_ENTRY (pass), 0); 
gtk_grid_attach (GTK_GRID (grid), pass, 1, 2, 1, 1); 

/* Add connect button */ 
button = gtk_button_new_with_label ("Connect"); 
g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL); 
gtk_grid_attach (GTK_GRID (grid), button, 0, 3, 2, 1); 

/* Add quit button */ 
button = gtk_button_new_with_label ("Quit"); 
g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); 
gtk_grid_attach (GTK_GRID (grid), button, 0, 4, 2, 1); 

/* Now that we are done packing our widgets, we show them all in one go, by calling gtk_widget_show_all() on the window.*/ 
gtk_widget_show_all (window); 

/* All GTK applications must have a gtk_main(). Control ends here and waits for an event to occur (like a key press or a mouse event), 
* until gtk_main_quit() is called. */ 
gtk_main(); 

return 0; 
} 

И я хочу, чтобы добавить больше виджетов ... Как я могу это сделать? Например я хочу, чтобы добавить строку меню (с О меню, например), но если я делаю:

gtk_container_add (GTK_CONTAINER (window), menubar); 

компилятор скажите мне, что я не могу добавить больше чем 1 виджет в окно ...

I разрабатывает gui с GTK + v3.4.1 на Ubuntu 12.04!

+0

Можете ли вы сузить проблему, чтобы нам не нужно было прочитывать весь ваш код? Это позволит людям быстрее и проще помочь вам. – ptomato

ответ

2

Вы должны добавить второй виджет в сетку, а не в окно. Окно может содержать только один виджет, в данном случае сетку. Сетка может содержать более одного виджета.

+0

Спасибо за вашу помощь ... я пишу это: gtk_grid_attach (GTK_GRID (сетка), menub, 1,1,1,1); menub = gtk_menu_bar_new(); file_item = gtk_menu_item_new_with_label («Файл»); file_menu = gtk_menu_new(); gtk_menu_item_set_submenu (GTK_MENU_ITEM (file_item), file_menu); ' , но я получить ошибку при выполнении: ' gtk_grid_attach: утверждение 'GTK_IS_WIDGET (ребенок)» failed' – polslinux

+0

Похоже, вы создаете строку меню виджета после того, как вы пытаетесь прикрепите его. Сначала создайте его, затем прикрепите. – ptomato

+0

Я обновил код и описание проблемы ... PS: спасибо за вашу помощь :) – polslinux

Смежные вопросы