0

4 列のテーブルを作成しました。最初の列は、ループが取り込まれたチェックボックスです。実際、すべての列にループが設定されています。2 列目はテキスト エントリ entry[x][y] で、x は列、y は行です。これが私がやりたいことです。1行目のチェックボックス(checkbox[y])にチェックを入れると、2列1行目の入力ボックス(entry[x][y])の文字色を変更したいです。答えは簡単ですが、私にはわかりません。アイデア?

4

1 に答える 1

0

さて、これは私の例です。もっと単純かもしれませんが、うまくいきます。

#include <gtk/gtk.h>
#include <stdio.h>
#define TABLE 4
#define C_RED "red"
#define C_BLACK "black"

typedef struct _Widgets Widgets;
struct _Widgets
{
    GtkWidget *checkbox;
    GtkWidget *entry[TABLE-1];
};

static void change_color (GtkWidget *widget, gpointer data)
{
    int i;
    GdkColor color;
    Widgets *_widget = (Widgets*) data;
    gchar *cc = NULL;

    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
        cc = C_RED;
    else
        cc = C_BLACK;

    gdk_color_parse (cc, &color);
    for (i = 0; i < TABLE; i++)
        gtk_widget_modify_fg (_widget->entry[i], GTK_STATE_NORMAL, &color);
}

int main (int argc, char **argv)
{
    int x,z;
    int pos = 0;
    GtkWidget *window = NULL;
    GtkWidget *table = NULL;
    Widgets widgets[TABLE];

    gtk_init (&argc, &argv);
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW(window), "Feel Gtk Table");
    g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
    table = gtk_table_new (TABLE, TABLE, FALSE);
    gtk_container_add (GTK_CONTAINER (window), table);


    for (x = 0; x < TABLE; x++)
    {
        widgets[x].checkbox = gtk_check_button_new ();
        gtk_table_attach_defaults (GTK_TABLE(table), widgets[x].checkbox, 0, 1, x, x+1);
        g_signal_connect (G_OBJECT (widgets[x].checkbox), "toggled", G_CALLBACK (change_color), &widgets[x]);
        for (z = 0; z < TABLE-1; z++)
        {
            widgets[x].entry[z] = gtk_entry_new();
            gtk_table_attach_defaults (GTK_TABLE(table), widgets[x].entry[z], z+1, z+2, x, x+1);
        }
    }
    gtk_widget_show_all (window);
    gtk_main ();

    return 0;
}
于 2012-05-29T22:41:09.903 に答える