文章目录
- 前言
- 源代码
前言
- 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