#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>
/*Devo fare un pulsante che, una volta premuto, legga
* i due numeri e ne calcoli l'MCD*/
int main(int argc, char *argv[]){
GtkWidget *window;
GtkWidget *table;
GtkWidget *label1;
GtkWidget *label2;
GtkWidget *label3;
GtkWidget *num1;
GtkWidget *num2;
GtkWidget *mcdt;
GtkWidget *button;
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_title(GTK_WINDOW(window), "MCD Calculator");
gtk_container_set_border_width(GTK_CONTAINER(window), 10);
table = gtk_table_new(4, 4, FALSE);
gtk_container_add(GTK_CONTAINER(window), table);
label1 = gtk_label_new("Num1");
label2 = gtk_label_new("Num2");
label3 = gtk_label_new("MCD");
gtk_table_attach(GTK_TABLE(table), label1, 0, 1, 0, 1, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK,5, 5);
gtk_table_attach(GTK_TABLE(table), label2, 0, 1, 1, 2, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK,5, 5);
gtk_table_attach(GTK_TABLE(table), label3, 0, 1, 3, 4, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK,5, 5);
num1 = gtk_entry_new();
num2 = gtk_entry_new();
mcdt = gtk_entry_new();
gtk_table_attach(GTK_TABLE(table), num1, 1, 2, 0, 1, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, 5, 5);
gtk_table_attach(GTK_TABLE(table), num2, 1, 2, 1, 2, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, 5, 5);
gtk_table_attach(GTK_TABLE(table), mcdt, 1, 2, 3, 4, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, 5, 5);
button = gtk_button_new_with_label ("Calcola MCD");
gtk_container_add(GTK_CONTAINER(window), button);
gtk_table_attach(GTK_TABLE(table), button, 1, 5, 2, 3, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0);
//g_signal_connect (button, "clicked", G_CALLBACK (callback), (gpointer) "Calcola");
gtk_widget_show_all(window);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_main();
return EXIT_SUCCESS;
}
这段代码给了我这个警告:
*Gtk-WARNING **: Attempting to add a widget with type GtkButton to a GtkWindow,
but as a GtkBin subclass a GtkWindow can only contain one widget at a time;
it already contains a widget of type GtkTable*
我读过我必须使用vbox或hbox,但我不明白如何使用它们。
答案 0 :(得分:2)
框小部件允许您添加多个子小部件,水平或垂直排列。表格小部件类似,但它允许二维网格布局。换句话说,hbox和vbox只是您已经使用的表的简化版本。
要使用框,只需创建一个hbox或vbox并将其添加到窗口中。
GtkWidget * box = gtk_hbox_new(0,0);
gtk_container_add(GTK_CONTAINER(window),box);
现在将表格和按钮添加到框中,而不是添加到窗口。
gtk_container_add(GTK_CONTAINER(box), table);
gtk_container_add(GTK_CONTAINER(box), button);
在您发布的代码中,您将按钮添加到两个不同的容器中。您应该禁用以下行之一。如果使用gtk_container_add()禁用该行,则实际上不需要使用框,因为您要将按钮添加到现有表中。
gtk_container_add(GTK_CONTAINER(box), button);
gtk_table_attach(GTK_TABLE(table), button, 1, 5, 2, 3, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0);
我认为编写回调也很有趣(也许也许有帮助)。
void callback()
{
const gchar * s1 = gtk_entry_get_text(GTK_ENTRY(num1));
const gchar * s2 = gtk_entry_get_text(GTK_ENTRY(num2));
int n1 = atoi(s1), n2=atoi(s2);
n1=abs(n1), n2=abs(n2); // GCD defined to return non-negative value
int i; for ( i=(n1>n2?n1:n2); i>=1; i-- ) if ( n1/i*i==n1 && n2/i*i==n2 ) break;
char s3[32]; snprintf(s3,32,"%d",i);
gtk_entry_set_text(GTK_ENTRY(mcdt),s3);
}
这就是hbox的样子。请注意,该按钮水平放置在表格旁边。