抱歉,我之前给出的示例代码存在问题。在添加子控件时,需要将 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助手提供,问题来源于学员提问