ZBLOG

(listtest:52278): Gtk-CRITICAL **: 10:31:28.256: gtk_container_add: assertion 'GTK_IS_CONTAINER (container)' failed

抱歉,我之前给出的示例代码存在问题。在添加子控件时,需要将 gtk_container_add() 改为 gtk_container_add(GTK_CONTAINER(inner_box), child_item->child_listbox);。这样才能将子级列表框添加到父级项目中。

下面是修正后的示例代码:

#include <gtk/gtk.h>

typedef struct {
    gchar *label;
    GtkWidget *child_listbox;
} ListItem;

ListItem *list_item_new(const gchar *label) {
    ListItem *item = g_malloc(sizeof(ListItem));
    item->label = g_strdup(label);
    item->child_listbox = NULL;
    return item;
}

void list_item_free(ListItem *item) {
    if (item == NULL)
        return;
    
    g_free(item->label);

    if (GTK_IS_WIDGET(item->child_listbox))
        gtk_widget_destroy(item->child_listbox);

    g_free(item);
}

void add_child_item(GtkListBoxRow *parent_row, ListItem *child_item) {
    GtkWidget *inner_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);

    GtkWidget *label = gtk_label_new(child_item->label);
    gtk_container_add(GTK_CONTAINER(inner_box), label);

    if (GTK_IS_WIDGET(child_item->child_listbox))
        gtk_container_add(GTK_CONTAINER(inner_box), child_item->child_listbox);

	gtk_widget_show_all(inner_box); // 显示内部容器及其内容

	GtkWidget *row = gtk_list_box_row_new();
	gtk_container_add(GTK_CONTAINER(row), inner_box);
	gtk_widget_show(row); // 显示行控件

	gtk_list_box_insert(GTK_LIST_BOX(parent_row), row, -1); // 将行插入父级列表框
}

int main(int argc, char *argv[]) {
	gtk_init(&argc, &argv);

	GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(window), "Multi-level List Demo");
	gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);
	gtk_container_set_border_width(GTK_CONTAINER(window), 10);

	GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
	gtk_container_add(GTK_CONTAINER(window), box);

	GtkWidget *listbox = gtk_list_box_new();
	gtk_box_pack_start(GTK_BOX(box), listbox, TRUE, TRUE, 0);

	ListItem *item1 = list_item_new("Item 1");
	GtkWidget *row1 = gtk_list_box_row_new();
	add_child_item(GTK_LIST_BOX_ROW(row1), item1);
	gtk_list_box_insert(GTK_LIST_BOX(listbox), row1, -1);

	ListItem *item2 = list_item_new("Subitem 1");
	item2->child_listbox = gtk_list_box_new();
	GtkWidget *row2 = gtk_list_box_row_new();
	add_child_item(GTK_LIST_BOX_ROW(row2), item2);
	gtk_container_add(GTK_CONTAINER(item1->child_listbox), row2);

    // 显示所有部件
    gtk_widget_show_all(window);

    // 进入主循环
    gtk_main();

    // 清理资源
	list_item_free(item1);  
	list_item_free(item2);  

	return 0;
}

希望这次能够正常运行。如果还有其他问题,请随时提问。非常抱歉给你带来的困扰!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=12753

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?