簡體   English   中英

GTK Tree View # 如何移除或隱藏列中的切換按鈕

[英]GTK Tree View # How to remove or hide the toggle button in column

定義了一個 GTK 樹視圖,其中一列呈現為切換按鈕。 現在每一行都顯示切換按鈕,有沒有辦法從某行完全刪除隱藏切換按鈕。 例如,我有以下示例

#include <gtk/gtk.h>

enum {
    COL_NUM_LIST = 0,
    COL_TOGGLE,
    COL_STRING,
    NUM_COLS
};

static GtkTreeModel*
create_and_fill_model(void) {
    GtkTreeStore *treestore;
    GtkTreeIter toplevel, child;

    treestore = gtk_tree_store_new(NUM_COLS,
            G_TYPE_STRING,
            G_TYPE_BOOLEAN,
            G_TYPE_STRING);

    /* Append a top level row and leave it empty */
    gtk_tree_store_append(treestore, &toplevel, NULL);
    gtk_tree_store_set(treestore, &toplevel,
            COL_NUM_LIST, "1",
            COL_TOGGLE, TRUE,
            COL_STRING, "Foo Bar",
            -1);

    /* Append a second top level row, and fill it with some data */
    gtk_tree_store_append(treestore, &toplevel, NULL);
    gtk_tree_store_set(treestore, &toplevel,
            COL_NUM_LIST, "2",
            COL_TOGGLE, TRUE,
            COL_STRING, "",  // empty
            -1);

    /* Append a child to the second top level row, and fill in some data */
    gtk_tree_store_append(treestore, &child, &toplevel);
    gtk_tree_store_set(treestore, &child,
            COL_NUM_LIST, "3",
            COL_TOGGLE, FALSE,
            COL_STRING, "Not needed toggle button here",
            -1);

    return GTK_TREE_MODEL(treestore);
}

void string_cell_data_func(GtkTreeViewColumn *col, GtkCellRenderer *renderer,
        GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) {
    char *string;

    gtk_tree_model_get(model, iter, COL_STRING, &string, -1);
    g_object_set(renderer, "text", string, NULL);
}

void toggle_cell_data_func(GtkTreeViewColumn *col, GtkCellRenderer *renderer,
        GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) {

    int bol;
    gtk_tree_model_get(model, iter, COL_TOGGLE, &bol, -1);

    if (bol == 0)
        g_object_set(renderer, "active", NULL, NULL);   // Can we somehow null or remove toggle button
    else
        g_object_set(renderer, "active", TRUE, NULL);
}

static GtkWidget*
create_view_and_model(void) {
    GtkTreeViewColumn *col;
    GtkCellRenderer *renderer;
    GtkWidget *view;
    GtkTreeModel *model;

    view = gtk_tree_view_new();

    // --- Column #1 ---
    col = gtk_tree_view_column_new();

    gtk_tree_view_column_set_title(col, "#");

    /* pack tree view column into tree view */
    gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);

    // toggle renderer
    renderer = gtk_cell_renderer_text_new();

    /* pack cell renderer into tree view column */
    gtk_tree_view_column_pack_start(col, renderer, TRUE);

    gtk_tree_view_column_add_attribute(col, renderer, "text", COL_NUM_LIST);


    // --- Column #2 ---

    col = gtk_tree_view_column_new();

    gtk_tree_view_column_set_title(col, "Toggle");

    /* pack tree view column into tree view */
    gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);

    // toggle renderer
    renderer = gtk_cell_renderer_toggle_new();

    /* pack cell renderer into tree view column */
    gtk_tree_view_column_pack_start(col, renderer, TRUE);

    gtk_tree_view_column_set_cell_data_func(col, renderer,
            toggle_cell_data_func, NULL, NULL);

    // --- Column #3 ---

    col = gtk_tree_view_column_new();

    gtk_tree_view_column_set_title(col, "String");

    /* pack tree view column into tree view */
    gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);

    // text renderer
    renderer = gtk_cell_renderer_text_new();

    /* pack cell renderer into tree view column */
    gtk_tree_view_column_pack_start(col, renderer, TRUE);

    gtk_tree_view_column_set_cell_data_func(col, renderer,
            string_cell_data_func, NULL, NULL);

    model = create_and_fill_model();

    gtk_tree_view_set_model(GTK_TREE_VIEW(view), model);

    g_object_unref(model); /* destroy model automatically with view */

    gtk_tree_selection_set_mode(
            gtk_tree_view_get_selection(GTK_TREE_VIEW(view)),
            GTK_SELECTION_NONE);

    return view;
}

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

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    g_signal_connect(window, "delete_event", gtk_main_quit, NULL); /* dirty */

    view = create_view_and_model();

    gtk_container_add(GTK_CONTAINER(window), view);

    gtk_widget_show_all(window);

    gtk_main();

    return 0;
}

使用 GTK 3 編譯和運行,它創建以下窗口

在此處輸入圖像描述

所以,我不需要在樹的#3 葉處切換按鈕。 我該如何隱藏它。

PS:我知道使用GTK,我可以將按鈕的狀態設置為禁用或不一致,但我可以完全隱藏它嗎?

您可以通過“g_object_set”函數修改您正在設置的屬性,如下面的代碼片段所示。

void toggle_cell_data_func(GtkTreeViewColumn *col, GtkCellRenderer *renderer,
                           GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
{

    int bol;
    gtk_tree_model_get(model, iter, COL_TOGGLE, &bol, -1);

    if (bol == 0)
        g_object_set(renderer, "visible", NULL, NULL);   // Can we somehow null or remove toggle button
    else
    {
        g_object_set(renderer, "visible", TRUE, "active", TRUE, NULL);
    }
}

對於不應出現的切換按鈕,我使用“可見”屬性代替“活動”屬性。 這產生了以下示例圖像。

隱藏按鈕

看看是否有幫助。

問候。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM