在gtkmm4中检索子控件(children)
- IT业界
- 2026-07-24 07:30:01
文章目录
前言源代码
前言
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)”