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);。这样才能将子级列表框添加到父级项目中。

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

  1. #include <gtk/gtk.h>
  2. typedef struct {
  3. gchar *label;
  4. GtkWidget *child_listbox;
  5. } ListItem;
  6. ListItem *list_item_new(const gchar *label) {
  7. ListItem *item = g_malloc(sizeof(ListItem));
  8. item->label = g_strdup(label);
  9. item->child_listbox = NULL;
  10. return item;
  11. }
  12. void list_item_free(ListItem *item) {
  13. if (item == NULL)
  14. return;
  15. g_free(item->label);
  16. if (GTK_IS_WIDGET(item->child_listbox))
  17. gtk_widget_destroy(item->child_listbox);
  18. g_free(item);
  19. }
  20. void add_child_item(GtkListBoxRow *parent_row, ListItem *child_item) {
  21. GtkWidget *inner_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
  22. GtkWidget *label = gtk_label_new(child_item->label);
  23. gtk_container_add(GTK_CONTAINER(inner_box), label);
  24. if (GTK_IS_WIDGET(child_item->child_listbox))
  25. gtk_container_add(GTK_CONTAINER(inner_box), child_item->child_listbox);
  26. gtk_widget_show_all(inner_box); // 显示内部容器及其内容
  27. GtkWidget *row = gtk_list_box_row_new();
  28. gtk_container_add(GTK_CONTAINER(row), inner_box);
  29. gtk_widget_show(row); // 显示行控件
  30. gtk_list_box_insert(GTK_LIST_BOX(parent_row), row, -1); // 将行插入父级列表框
  31. }
  32. int main(int argc, char *argv[]) {
  33. gtk_init(&argc, &argv);
  34. GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  35. gtk_window_set_title(GTK_WINDOW(window), "Multi-level List Demo");
  36. gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);
  37. gtk_container_set_border_width(GTK_CONTAINER(window), 10);
  38. GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
  39. gtk_container_add(GTK_CONTAINER(window), box);
  40. GtkWidget *listbox = gtk_list_box_new();
  41. gtk_box_pack_start(GTK_BOX(box), listbox, TRUE, TRUE, 0);
  42. ListItem *item1 = list_item_new("Item 1");
  43. GtkWidget *row1 = gtk_list_box_row_new();
  44. add_child_item(GTK_LIST_BOX_ROW(row1), item1);
  45. gtk_list_box_insert(GTK_LIST_BOX(listbox), row1, -1);
  46. ListItem *item2 = list_item_new("Subitem 1");
  47. item2->child_listbox = gtk_list_box_new();
  48. GtkWidget *row2 = gtk_list_box_row_new();
  49. add_child_item(GTK_LIST_BOX_ROW(row2), item2);
  50. gtk_container_add(GTK_CONTAINER(item1->child_listbox), row2);
  51. // 显示所有部件
  52. gtk_widget_show_all(window);
  53. // 进入主循环
  54. gtk_main();
  55. // 清理资源
  56. list_item_free(item1);
  57. list_item_free(item2);
  58. return 0;
  59. }

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


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?