在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
相关推荐
大数据张老师6 分钟前
数据结构——BF算法
数据结构·算法·1024程序员节
让我们一起加油好吗16 分钟前
【数论】欧拉定理 && 扩展欧拉定理
c++·算法·数论·1024程序员节·欧拉定理·欧拉降幂·扩展欧拉定理
Yupureki23 分钟前
从零开始的C++学习生活 14:map/set的使用和封装
c语言·数据结构·c++·学习·visual studio·1024程序员节
一匹电信狗30 分钟前
【LeetCode_876_2.02】快慢指针在链表中的简单应用
c语言·数据结构·c++·算法·leetcode·链表·stl
keineahnung234530 分钟前
C++中的Aggregate initialization
c++·1024程序员节
胖咕噜的稞达鸭33 分钟前
算法入门---专题二:滑动窗口2(最大连续1的个数,无重复字符的最长子串 )
c语言·数据结构·c++·算法·推荐算法·1024程序员节
兮山与36 分钟前
算法18.0
算法
Yupureki39 分钟前
从零开始的C++学习生活 15:哈希表的使用和封装unordered_map/set
c语言·数据结构·c++·学习·visual studio·1024程序员节
Q一件事42 分钟前
R语言随机森林分析显示R方和P值
开发语言·随机森林·r语言
我是华为OD~HR~栗栗呀43 分钟前
华为OD-Java面经-21届考研
java·c++·后端·python·华为od·华为·面试