在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
相关推荐
海兰24 分钟前
【 Python 量化交易】开篇
开发语言·python·信息可视化·量化交易
啥都想学点的研究生38 分钟前
一篇文章讲清楚:逻辑回归
算法·机器学习·逻辑回归
神仙别闹1 小时前
基于C++ WinPcap 的网络抓包软件
网络·c++·php
我的xiaodoujiao1 小时前
Django 基础知识详细图文教程 4-Django 视图定义与使用
开发语言·数据库·后端·测试工具·django·sqlite
l1t1 小时前
DeepSeek总结的DuckDB在 CI 中为 release 和 glibc CLI 构建启用 LTO - #24225
开发语言·数据库·ci/cd·duckdb
whitelbwwww1 小时前
c++运行RKNN
开发语言·c++
2601_962070231 小时前
差异基因富集分析(R语言——GO&KEGG&GSEA)
开发语言·golang·r语言
布莱克6051 小时前
栈(Stack)详解:定义、作用、应用场景及与队列的区别(附 C/C++ 代码)
c语言·开发语言·c++·
zmzb01031 小时前
C++课后习题训练记录Day203
开发语言·c++
zzzll11112 小时前
LangChain4j:Java 生态的 AI 应用开发利器
java·开发语言·人工智能