在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
相关推荐
一拳一个呆瓜1 天前
【STL】iostream 编程:缓冲区的作用
c++·stl
沙蒿同学1 天前
当古诗词遇上 AI:从 38 万句诗词中取一个好名字
python·算法·架构
变量未定义~1 天前
单调栈、单调队列(模板)、子矩阵(模板)
数据结构·算法·蓝桥杯
不会就选b1 天前
算法日常・每日刷题--<快速排序>2
数据结构·算法
xxie1237941 天前
Python装饰器与语法糖
开发语言·python
郑州光合科技余经理1 天前
海外外卖平台源码改造实战——多语言核心代码实现
java·开发语言·前端·后端·mysql·架构·php
CClaris1 天前
大模型量化从0到1(五):GPTQ 原理详解 + 从零量化一个真实大模型
人工智能·python·算法·机器学习
凯瑟琳.奥古斯特1 天前
力扣1012数位DP解法详解
开发语言·c++·算法·leetcode·职场和发展
Railshiqian1 天前
UserPickerActivity 内部逻辑分析
开发语言·python
喜欢打篮球的普通人1 天前
Trition程序编写:从“Hello CUDA“到“Hello Triton“:向量加法背后的编译黑魔法
开发语言·后端·rust