在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
相关推荐
阿里嘎多学长几秒前
2026-02-25 GitHub 热点项目精选
开发语言·程序员·github·代码托管
载数而行520几秒前
算法系列4之插入排序
数据结构·c++·算法·排序算法
会员果汁2 分钟前
二分搜索-C
c语言·算法
智者知已应修善业2 分钟前
【查找指定字符串首位置与数量不区分大小写完整匹配】2025-5-3
c语言·c++·经验分享·笔记·算法
fengfuyao9855 分钟前
基于局部均值分解(LMD)的MATLAB信号分解程序实现
算法·matlab·均值算法
㓗冽5 分钟前
分割数字并排序(字符串)-基础题103th + A == B ?(字符串)-基础题104th + 母牛制造的回文(字符串)-基础题105th
算法
troublea5 分钟前
ThinkPHP vs Laravel:PHP框架终极对决
开发语言·php·laravel
Ronin30510 分钟前
信道管理模块和异步线程模块
开发语言·c++·rabbitmq·异步线程·信道管理
LawrenceLan15 分钟前
30.Flutter 零基础入门(三十):GridView 网格布局 —— 九宫格与商品列表必学
开发语言·前端·flutter·dart
yoyo君~15 分钟前
从内存管理到并发架构:C++ 核心内功修炼指南
开发语言·c++·学习·无人机