如何统计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
相关产品推荐
相关产品推荐

