在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()
  • 通过以上这些, 可以完成遍历

源代码

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();
    }
};
  • 美化一下输出结果

    cpp 复制代码
    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;
                }
            }
        }
    };

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

    text 复制代码
    |-- gtkmm__GtkBox
    |-- |-- gtkmm__GtkLabel
    |-- 
    |-- gtkmm__GtkBox
    |-- |-- gtkmm__GtkLabel
    |-- |-- gtkmm__GtkButton
    |-- --- |-- gtkmm__GtkLabel
    |-- --- 
    |-- 
    |-- gtkmm__GtkBox
    |-- |-- gtkmm__GtkLabel
    |-- 
    |-- gtkmm__GtkBox
相关推荐
qq_4069810321 分钟前
c++拷贝构造函数
开发语言·c++
bro_Java66630 分钟前
《排序的底层逻辑:比较、交换与分治》
java·算法·排序算法
爱喝雪碧的可乐1 小时前
MATLAB
开发语言·算法·matlab
叼烟扛炮1 小时前
Linux 学习笔记(六十):单线程的逆袭——epoll 高并发服务器实战
linux·服务器·网络·笔记·学习·算法
careathers2 小时前
【数据结构】基于比较的排序算法 - 交换排序
数据结构·算法·排序算法
H.莓飛3 小时前
【C++】【STL】vector_OJ题
linux·服务器·开发语言·数据结构·c++·visual studio
Rabitebla3 小时前
【Linux操作系统】进程篇(十一):进程程序替换——从底层原理到 exec 函数族
linux·服务器·c++·笔记·学习·算法
tellmewhoisi3 小时前
深度学习0:数学知识:正态分布1
人工智能·深度学习·算法
-梅3 小时前
算法(1) 动态规划
算法·动态规划
沫璃染墨3 小时前
从零入门计算机网络系列(十五):TCP可靠传输机制详解——从序号与确认应答到乱序处理
服务器·网络·c++·tcp/ip·tcp