4

私は C と GTK+ に本当に慣れていないので、私の問題は非常に明白かもしれません。私は、ネット上で見つかった例とチュートリアルに従おうとしました。

3 つの値を持つコンボ ボックスが必要です。中央の値がデフォルトです。Glade を使用して正常にセットアップできますが、すべてを C で書き直すことにしました。コンボボックスは描画されますが、空/空白です。何が間違っているのかわかりません。

...
GtkTreeIter iter;
GtkListStore *liststore;
GtkWidget *combo;

liststore = gtk_list_store_new(1, G_TYPE_STRING);
gtk_list_store_insert_with_values (liststore, &iter, 0, 0, "Don't install.", -1);
gtk_list_store_insert_with_values (liststore, &iter, 1, 0, "This user only.", -1);
gtk_list_store_insert_with_values (liststore, &iter, 2, 0, "All users.", -1);

combo = gtk_combo_box_new_with_model(GTK_TREE_MODEL(liststore));
gtk_combo_box_set_active (GTK_COMBO_BOX(combo), 1);
...
gtk_grid_attach (GTK_GRID(grid), combo, 2, 4, 1, 1);
...
4

2 に答える 2

10

元のコードでは、データ モデルをコンボ ボックスに正しくバインドしましたが、モデルの表示方法を指定していませんでした(これは概念view全体の一部です)。model-viewこれは、GtkCellLayoutが提供するはずのものです。

この追加された複雑さが役立つ理由を理解するために、モデルを使用してカスタムの背景を作成する方法を示す例を次に示します (これは悪い UX であり、テーマによっては背景色を完全に無視できます)。最も難しいのはメモリ リークを回避することだと思うので、この点についてコメントを追加しました。

#include <gtk/gtk.h>

int main(int argc, char **argv)
{
    GtkWidget *window;
    GtkListStore *liststore;
    GtkWidget *combo;
    GtkCellRenderer *column;

    gtk_init(&argc, &argv);

    liststore = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
    gtk_list_store_insert_with_values(liststore, NULL, -1,
                                      0, "red",
                                      1, "Don't install.",
                                      -1);
    gtk_list_store_insert_with_values(liststore, NULL, -1,
                                      0, "green",
                                      1, "This user only.",
                                      -1);
    gtk_list_store_insert_with_values(liststore, NULL, -1,
                                      0, "yellow",
                                      1, "All users.",
                                      -1);

    combo = gtk_combo_box_new_with_model(GTK_TREE_MODEL(liststore));

    /* liststore is now owned by combo, so the initial reference can
     * be dropped */
    g_object_unref(liststore);

    column = gtk_cell_renderer_text_new();
    gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), column, TRUE);

    /* column does not need to be g_object_unref()ed because it
     * is GInitiallyUnowned and the floating reference has been
     * passed to combo by the gtk_cell_layout_pack_start() call. */

    gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo), column,
                                   "cell-background", 0,
                                   "text", 1,
                                   NULL);

    gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 1);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_container_add(GTK_CONTAINER(window), combo);

    /* Also combo is GInitiallyUnowned and it is now owned
       by window after the gtk_container_add() call. */

    gtk_widget_show_all(window);
    gtk_main();

    return 0;
}

ただし、コンボ ボックスで文字列のみを使用する場合は、GtkComboBoxTextを利用してコードを削除できます。

#include <gtk/gtk.h>

int main(int argc, char **argv)
{
    GtkWidget *window, *combo;

    gtk_init(&argc, &argv);

    combo = gtk_combo_box_text_new();
    gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combo), NULL, "Don't install.");
    gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combo), NULL, "This user only.");
    gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combo), NULL, "All users");
    gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 1);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_container_add(GTK_CONTAINER(window), combo);

    gtk_widget_show_all(window);
    gtk_main();

    return 0;
}
于 2013-05-19T10:42:51.627 に答える
2

私は解決策を見つけたと思います。

コンボ ボックスにセル レンダラーを挿入する必要がありました。コンボボックスの作成とデフォルトのアクティブ値の設定の間にこのコードを追加しました。

GtkCellRenderer *combocell = gtk_cell_renderer_text_new ();
gtk_cell_layout_pack_start( GTK_CELL_LAYOUT(combo), combocell, TRUE );
gtk_cell_layout_set_attributes( GTK_CELL_LAYOUT(combo), combocell, "text", 0, NULL );

私はまだこれを理解していません.GtkCellLayoutにどのような属性が必要なのか、どのように機能するのかわかりません。補足的な読み物は大歓迎です。

于 2013-05-19T02:06:44.903 に答える