主页 > IT业界  > 

在gtkmm4中检索子控件(children)


文章目录 前言源代码

前言 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
标签:

在gtkmm4中检索子控件(children)由讯客互联IT业界栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“在gtkmm4中检索子控件(children)