创建一个简单的 gtk 列表

标签 c linux gtk gtk3

我想在 gtk 中创建一个包含以下内容的简单表格:

| test name | 0 | 10 |

我只是想创建这个,但是 gtk 并没有让这变得容易。我制作了一个包含我需要的所有信息的 GtkListStore,但显然我还需要创建一个 GtkTreeViewColumn。我需要将值传递给 gtk_tree_view_column_new_with_attributes,但问题是我不知道任何属性名称,而且我无法在任何地方找到它们。我发现的唯一属性是“文本”,但我也传递了无符号整数。有人能告诉我这些属性是什么,以及如何创建一个简单的表吗? (我读了 https://developer.gnome.org/gtk3/stable/TreeWidget.html 顺便说一句)

enum { FILE_NAME = 0, FILE_OFFSET, FILE_SIZE };

GtkWidget*          tree;
GtkListStore*       store;
GtkTreeIter         iter;
GtkCellRenderer*    renderer;
GtkTreeViewColumn*  column;

store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT);
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter, FILE_NAME, "test name", FILE_OFFSET, 0, 
        FILE_SIZE, 10, -1);

tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
g_object_unref (G_OBJECT (store));
renderer = gtk_cell_renderer_text_new ();

column = gtk_tree_view_column_new_with_attributes ("Name", renderer, 
        "text", FILE_NAME, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);

使用发布的代码,我得到以下结果:

| name ?    |
| test name |

最佳答案

您必须了解模型和 View 是独立的概念。

GtkListStore 是模型并包含要显示的数据。它还可以有一堆 View 不需要的其他数据,例如它可以是更一般的 SQL 查询的结果。

GtkTreeView 是 View ,您必须指示它如何在屏幕上显示数据。它通过在矩形区域内打包不同的列来实现。以下示例让您了解可以完成什么:

#include <gtk/gtk.h>

enum {
    FILE_NAME,
    FILE_OFFSET,
    FILE_SIZE,
    FILE_DESCRIPTION, /* Not used by the view, maybe used elsewhere */
    COLOR,            /* Just to show how the model can affect the view */
    N_COLUMNS
};

gint main(gint argc, gchar **argv)
{
    GtkListStore*      model;
    GtkWidget*         view;
    GtkTreeViewColumn* column;
    GtkWidget*         window;

    gtk_init(&argc, &argv);

    /* MODEL */
    model = gtk_list_store_new(N_COLUMNS,
                               G_TYPE_STRING,   /* FILE_NAME */
                               G_TYPE_UINT,     /* FILE_OFFSET */
                               G_TYPE_UINT,     /* FILE_SIZE */
                               G_TYPE_STRING,   /* FILE_DESCRIPTION */
                               G_TYPE_STRING    /* COLOR */
                              );
    gtk_list_store_insert_with_values(model, NULL, -1,
                                      FILE_NAME, "test name",
                                      FILE_OFFSET, 0,
                                      FILE_SIZE, 10,
                                      -1);
    gtk_list_store_insert_with_values(model, NULL, -1,
                                      FILE_NAME, "Dummy",
                                      FILE_OFFSET, 123,
                                      COLOR, "black",
                                      -1);
    gtk_list_store_insert_with_values(model, NULL, -1,
                                      COLOR, "blue",
                                      -1);

    /* VIEW */
    view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model));
    g_object_unref(model);

    column = gtk_tree_view_column_new_with_attributes("Name",
                                                      gtk_cell_renderer_text_new(),
                                                      "text", FILE_NAME,
                                                      "background", COLOR,
                                                      NULL);
    gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);

    column = gtk_tree_view_column_new_with_attributes("Offset",
                                                      gtk_cell_renderer_spin_new(),
                                                      "text", FILE_OFFSET,
                                                      NULL);
    gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);

    column = gtk_tree_view_column_new_with_attributes("Size",
                                                      gtk_cell_renderer_text_new(),
                                                      "text", FILE_SIZE,
                                                      NULL);
    gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);

    /* MAIN */
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_container_add(GTK_CONTAINER(window), view);
    gtk_widget_show_all(window);

    gtk_main ();

    return 0;
}

关于创建一个简单的 gtk 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21486319/

相关文章:

c - 在内核空间中使用strsep来分隔字符串

c - 十进制转二进制

linux - 编译自定义内核时,modules_install 会导致错误

c - 我如何运行 gtk 演示?

python - 滚动到 ScrolledWindow/TextView 的末尾

c - 为什么在 C 中对动态链接的符号执行指针运算时会得到错误的结果?

c - 在高度平衡树中使用反向指针是什么意思?

linux - 如何在Linux中打开子目录中的最新文件?

linux - mongodb 和非常高的锁定百分比和低吞吐量

c - 如何在 GTK 中将图像堆叠在绘图区域上方