You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计Gtk::Grid内小部件数量及QT转gtkmm等效实现问题

Qt到gtkmm的对等功能实现方案

问题1:Gtk::Grid/Gtk::Box获取子部件数量、遍历子部件的实现

所有gtkmm容器类都继承自Gtk::Container基类,基类提供了get_children()方法,直接返回存储所有子部件指针的std::vector<Gtk::Widget*>,需要获取子部件总数时直接取该vector的size()即可。
你提供的场景下可以直接按坐标遍历直到返回空指针,也可以通过get_children()全量遍历,修改后的代码示例如下:

for(auto& grid : layouts) { //layouts是Gtk::Grid*类型的vector
    // 适配原逻辑:遍历第一列所有行的子部件
    int row = 0;
    while(Gtk::Widget* child = grid->get_child_at(0, row)) {
        child->set_visible((std::string(grid->get_name())== StringID));
        row++;
    }

    // 通用全量遍历子部件的写法,不关心子部件坐标
    // auto all_children = grid->get_children();
    // int child_count = all_children.size(); // 对应Qt的count()返回值
    // for(auto* child : all_children) {
    //     子部件操作逻辑
    // }
}

问题2:通用部件类型、尺寸类的替换方案

2.1 QWidget的对等替换

你当前的替换方案仅适配部分场景:

  • 若原代码中QWidget是作为空白容器承载其他子部件,那么用Gtk::Box/Gtk::Grid替代是合理的。
  • 若原代码中QWidget是作为通用类型指针存储任意类型的控件(按钮、复选框等),gtkmm中对等的类型是Gtk::Widget*,它是所有可视化部件的抽象基类,完全可以用来声明通用部件向量,比如std::vector<Gtk::Widget*> widgets就对应Qt中的std::vector<QWidget*> widgets。

2.2 QSize的对等替换

你混淆了Gtk::Scale的用途:Gtk::Scale是滑块选择控件,和Qt的QSlider功能对等,和尺寸设置逻辑无关。

  • Qt中QSize对应的gtkmm类型是Gtk::Requisition结构体,内置int width和int height两个成员存储宽高值。
  • 如果你需要实现原来用QSize设置控件尺寸的逻辑,直接调用Gtk::Widget的set_size_request(int width, int height)方法即可,传入宽、高两个参数就对应原来QSize的两个入参。

内容的提问来源于stack exchange,提问作者le1nax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 04:54:03