文章目录
前言
- 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() - 通过以上这些, 可以完成遍历
源代码
cpp
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();
}
};
-
美化一下输出结果
cppvoid 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; } } } };
这样输出关系就可观一点:
text|-- gtkmm__GtkBox |-- |-- gtkmm__GtkLabel |-- |-- gtkmm__GtkBox |-- |-- gtkmm__GtkLabel |-- |-- gtkmm__GtkButton |-- --- |-- gtkmm__GtkLabel |-- --- |-- |-- gtkmm__GtkBox |-- |-- gtkmm__GtkLabel |-- |-- gtkmm__GtkBox