求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
相关产品推荐
相关产品推荐

