c - gtk vbox 或 hbox

标签 c layout gtk vbox hbox

#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,但我不明白如何使用它们。

最佳答案

盒子小部件允许您添加多个水平或垂直排列的子小部件。表格小部件类似,但它允许二维网格布局。换句话说,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 的样子。请注意,该按钮水平放置在表格旁边。

enter image description here

关于c - gtk vbox 或 hbox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6963378/

相关文章:

c - 输入后的程序 block

c - 查找最后一个字符出现的最有效方法

swift - 约束不断变化但布局没有更新?

python - wxStaticBitmap 与 wxPtyhon 在 GTK+ 不工作

haskell - Haskell 中的图形转换句柄

c - 将文件读入结构体

c - ANTLR 3.4(C 运行时)中的 antlr3NewAsciiStringCopyStream 发生了什么?

php - CakePHP:如何使用 PHP 在 MVC 框架中动态使用 CSS 属性类型

android - 以编程方式用按钮填充屏幕

无法在 GtkTreeView 可编辑行中使用键盘键入(但可以右键单击+粘贴)