【问题标题】:gtk grid add two widgetsgtk 网格添加两个小部件
【发布时间】:2012-04-21 17:05:30
【问题描述】:

我有这个代码:

/* 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 个小部件...

我正在 Ubuntu 12.04 上使用 GTK+ v3.4.1 开发 gui!

【问题讨论】:

  • 您能否缩小问题范围,这样我们就不必通读您的代码转储了?这将使人们能够更快、更轻松地为您提供帮助。

标签: gtk gtk3


【解决方案1】:

您必须将第二个小部件添加到网格,而不是窗口。窗口只能包含一个小部件,在本例中为网格。网格可以包含多个小部件。

【讨论】:

  • 感谢您的帮助...我已经写了这个:gtk_grid_attach (GTK_GRID (grid), menub, 1,1,1,1); menub = gtk_menu_bar_new (); file_item = gtk_menu_item_new_with_label ("File"); file_menu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (file_item), file_menu); 但执行时出现错误:gtk_grid_attach: assertion GTK_IS_WIDGET (child)' failed`
  • 看起来您在尝试附加菜单栏小部件后正在创建它。先创建,再附加。
  • 我已经更新了代码和问题描述... PS:感谢您的帮助:)
  • 我知道如果你习惯了论坛,Stack Overflow 寻求帮助的方式会很陌生,但请不要这样做。如果您将问题编辑成一个完全不同的问题,那么这个答案就没有意义了。更糟糕的是,原来的问题已经不再帮助有同样问题的人了!最好的方法是让我将您的问题编辑回原来的样子,您单击复选标记让其他人知道这个特定问题已得到解决,然后打开一个新问题以寻求有关您的新问题的帮助。祝你好运;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多