文章目录

  • 前言
  • 源代码

前言

  • gtkmm4.10已经没有控件的 get_children() 方法了
  • 但引进了observe_children() 但这个如其名字一样, 不能对子控件作修改
    可以用它返回的对象.get_n_items() 获取子控件的数量
  • 还有如下的代替
    get_first_child() : 如果只有一个child 则first与last返回同一个
    get_last_child()
    get_next_sibling() : 如果没有将返回 NULL
    get_prev_sibling()
    get_child()
    get_parent()
  • 通过以上这些, 可以完成遍历

源代码

  • void RetrieveChildren(Gtk::Widget* container){auto curr_child = container->get_first_child();while (curr_child){std::cout << curr_child->get_name() << std::endl;RetrieveChildren(curr_child) ;curr_child = curr_child->get_next_sibling();}};
  • 美化一下输出结果
    void ArrangeHolder(string& Holder){// 输入的字符串,其中可能包含散落的 '|' 字符// 第一步:将所有 '|' 替换为临时字符 '-'std::regex replaceAllPattern(R"(\|)");std::string temp = std::regex_replace(Holder, replaceAllPattern, "-");// 第二步:只将第一个和最后一个 '-' 替换回 '|'temp.replace(0, 1, 1, '|');temp.replace(temp.size() - 4, 1, 1, '|');Holder = temp;}void RetrieveChildren(Gtk::Widget* container){static string Holder;auto first_child = container->get_first_child();auto curr_child = first_child;if (first_child){Holder += "|-- ";while (curr_child){ArrangeHolder(Holder);std::cout << Holder << curr_child->get_name() << std::endl;RetrieveChildren(curr_child) ;curr_child = curr_child->get_next_sibling();if (!curr_child){Holder.erase(Holder.size() - 4);std::cout << Holder << std::endl;}}}};

    这样输出关系就可观一点:

    |-- gtkmm__GtkBox|-- |-- gtkmm__GtkLabel|-- |-- gtkmm__GtkBox|-- |-- gtkmm__GtkLabel|-- |-- gtkmm__GtkButton|-- --- |-- gtkmm__GtkLabel|-- --- |-- |-- gtkmm__GtkBox|-- |-- gtkmm__GtkLabel|-- |-- gtkmm__GtkBox