You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求GTK4 ColumnView C语言字符串示例,修改GListStore类型后报错

GTK4 ColumnView 多列字符串表格实现示例

直接上可运行的C语言代码,实现5列字符串表格展示。核心是自定义一个包含多字符串属性的GObject子类作为列表项类型——GListStore要求元素必须是GObject派生类型,直接用G_TYPE_STRING会报错,这就是你之前出错的原因:

#include <gtk/gtk.h>

#define TYPE_MY_ROW (my_row_get_type())
G_DECLARE_FINAL_TYPE(MyRow, my_row, MY, ROW, GObject)

struct _MyRow {
  GObject parent_instance;
  gchar *col1;
  gchar *col2;
  gchar *col3;
  gchar *col4;
  gchar *col5;
};

G_DEFINE_TYPE(MyRow, my_row, G_TYPE_OBJECT)

static void my_row_dispose(GObject *object) {
  MyRow *row = MY_ROW(object);

  g_free(row->col1);
  g_free(row->col2);
  g_free(row->col3);
  g_free(row->col4);
  g_free(row->col5);

  G_OBJECT_CLASS(my_row_parent_class)->dispose(object);
}

static void my_row_class_init(MyRowClass *klass) {
  GObjectClass *object_class = G_OBJECT_CLASS(klass);
  object_class->dispose = my_row_dispose;

  // 注册5个字符串属性,对应表格的5列
  g_object_class_install_property(object_class, 1,
    g_param_spec_string("col1", "Column 1", "First column content",
                        NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
  g_object_class_install_property(object_class, 2,
    g_param_spec_string("col2", "Column 2", "Second column content",
                        NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
  g_object_class_install_property(object_class, 3,
    g_param_spec_string("col3", "Column 3", "Third column content",
                        NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
  g_object_class_install_property(object_class, 4,
    g_param_spec_string("col4", "Column 4", "Fourth column content",
                        NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
  g_object_class_install_property(object_class, 5,
    g_param_spec_string("col5", "Column 5", "Fifth column content",
                        NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
}

static void my_row_init(MyRow *row) {}

// 创建行数据的辅助函数
static MyRow* my_row_new(const gchar *c1, const gchar *c2, const gchar *c3, const gchar *c4, const gchar *c5) {
  return g_object_new(TYPE_MY_ROW,
                      "col1", c1,
                      "col2", c2,
                      "col3", c3,
                      "col4", c4,
                      "col5", c5,
                      NULL);
}

static void activate(GtkApplication *app, gpointer user_data) {
  GtkWidget *window = gtk_application_window_new(app);
  gtk_window_set_title(GTK_WINDOW(window), "GTK4 字符串表格");
  gtk_window_set_default_size(GTK_WINDOW(window), 800, 400);

  // 创建列表存储,存储自定义的MyRow对象
  GListStore *store = g_list_store_new(TYPE_MY_ROW);
  // 添加示例数据
  g_list_store_append(store, my_row_new("行1列1", "行1列2", "行1列3", "行1列4", "行1列5"));
  g_list_store_append(store, my_row_new("行2列1", "行2列2", "行2列3", "行2列4", "行2列5"));
  g_list_store_append(store, my_row_new("行3列1", "行3列2", "行3列3", "行3列4", "行3列5"));
  g_list_store_append(store, my_row_new("行4列1", "行4列2", "行4列3", "行4列4", "行4列5"));

  // 创建ColumnView,绑定列表模型
  GtkWidget *column_view = gtk_column_view_new(gtk_single_selection_new(G_LIST_MODEL(store)));
  gtk_column_view_set_show_column_separators(GTK_COLUMN_VIEW(column_view), TRUE);
  gtk_column_view_set_show_row_separators(GTK_COLUMN_VIEW(column_view), TRUE);

  // 封装创建列的辅助逻辑(避免重复代码)
  auto create_column = [](const gchar *title, const gchar *prop_name) -> GtkColumnViewColumn* {
    GtkListItemFactory *factory = gtk_signal_list_item_factory_new();
    // Setup:创建标签作为单元格内容
    g_signal_connect(factory, "setup", G_CALLBACK(
      [](GtkSignalListItemFactory *factory, GtkListItem *item) {
        GtkWidget *label = gtk_label_new(NULL);
        gtk_label_set_xalign(GTK_LABEL(label), 0.0);
        gtk_list_item_set_child(item, label);
      }), NULL);
    // Bind:将行数据的属性绑定到标签文本
    g_signal_connect(factory, "bind", G_CALLBACK(
      [](GtkSignalListItemFactory *factory, GtkListItem *item, gpointer prop_name) {
        MyRow *row = MY_ROW(gtk_list_item_get_item(item));
        const gchar *text = NULL;
        g_object_get(row, (const gchar*)prop_name, &text, NULL);
        gtk_label_set_text(GTK_LABEL(gtk_list_item_get_child(item)), text ? text : "");
      }), (gpointer)prop_name);
    return gtk_column_view_column_new(title, factory);
  };

  // 添加5列到ColumnView
  gtk_column_view_append_column(GTK_COLUMN_VIEW(column_view), create_column("列1", "col1"));
  gtk_column_view_append_column(GTK_COLUMN_VIEW(column_view), create_column("列2", "col2"));
  gtk_column_view_append_column(GTK_COLUMN_VIEW(column_view), create_column("列3", "col3"));
  gtk_column_view_append_column(GTK_COLUMN_VIEW(column_view), create_column("列4", "col4"));
  gtk_column_view_append_column(GTK_COLUMN_VIEW(column_view), create_column("列5", "col5"));

  // 添加滚动容器(表格内容过多时可滚动)
  GtkWidget *scrolled_window = gtk_scrolled_window_new();
  gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(scrolled_window), column_view);
  gtk_window_set_child(GTK_WINDOW(window), scrolled_window);

  gtk_widget_show(window);
}

int main(int argc, char **argv) {
  GtkApplication *app = gtk_application_new("org.example.StringColumnView", G_APPLICATION_DEFAULT_FLAGS);
  g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
  int status = g_application_run(G_APPLICATION(app), argc, argv);
  g_object_unref(app);
  return status;
}

编译命令

使用你指定的命令编译即可:

gcc -o a e.c $(pkg-config --cflags --libs gtk4)

运行编译后的./a就能看到一个带5列字符串数据的表格窗口。

内容的提问来源于stack exchange,提问作者Languedock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 02:47:07