【问题标题】:Creating a 2D GtkWidget array创建一个 2D GtkWidget 数组
【发布时间】:2013-03-31 09:22:43
【问题描述】:

我想创建一个 GtkWidget 类型的 10x20 数组。我想让它们中的每一个都成为一个 GtkEventBox,我将在其中附加一个标签。

我应该如何创建和使用 2D GtkWidget* 数组?

这是我迄今为止尝试过的:

//global variable:
GtkWidget *labelPlate[ROWS][COLUMNS];
...
...
inside the function that creates the table and attaches the event boxes to it
//my table, where the EventBoxes will be attached to
GtkWidget *finalPlateTable = gtk_table_new (10, 20, TRUE);

int i, j;
for(i = 0; i<ROWS; i++){
    for(j=0 ; j<COLUMNS; j++){
        //Make a char with the current float and create a label with it.

        char finalString[14];
        sprintf(finalString, "%.2f", plate[i][j]);

        GtkWidget *label = gtk_label_new(finalString);;

        //Labels cannot have bg color, so attach each label to an event box
        /*HERE I GET SEG FAULT*/
        labelPlate[i][j]=gtk_event_box_new();

                    //adding the label to my eventbox
        gtk_container_add(GTK_CONTAINER(labelPlate[i][j]), label);

        //Add the corresponding bg color to each event box
        GdkColor color;
        switch(scalePlate[i][j]){
                            ...
                            ...
            break;
        }
                    //coloring the event box with the corresponding background
        gtk_widget_modify_bg ( GTK_WIDGET(labelPlate[i][j]), GTK_STATE_NORMAL, &color);
                    //attach the event box to the appropriate location of my table
        gtk_table_attach_defaults (GTK_TABLE (finalPlateTable), labelPlate[i][j], j, j+1, i, i+1);
        //show them!
        gtk_widget_show(label);
        gtk_widget_realize(labelPlate[i][j]);
    }
}
//adding the table to my vertical box, and show both of them
gtk_box_pack_start(GTK_BOX (verticalBox), finalPlateTable, TRUE, TRUE, 10);

gtk_widget_show (finalPlateTable);
gtk_widget_show (verticalBox);

我想指出,我对 C 还很陌生,我不知道如何使用malloc(但我怀疑我现在应该使用它)。

【问题讨论】:

    标签: c multidimensional-array segmentation-fault gtk background-color


    【解决方案1】:

    我找到了解决办法:

    初始化数组为:

    GtkWidget **myarray;
    myarray = g_new(GtkWidget *, ROWS*COLUMNS);
    

    然后使用函数访问特定的行和列:

    int returnPosAt(int row, int column){
        return row*COLUMNS+column;
    }
    

    那么,你可以调用

    myarray[returnPosAt(i, j)]=gtk_event_box_new();
    

    所以,实际上您有一个 1D 数组,通过调用该函数,您可以获得 2D 位置 (i, j) 的相应 1D pos。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-31
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 2020-04-09
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      相关资源
      最近更新 更多