如何计算 Gtk::Grid 中存储的小部件?

How can I count the widgets stored in a Gtk::Grid?

我正在寻找等同于某些 QT 表达式的几种 gtkmm methods/data 类型:

  1. 给定 QT 中的小部件容器(例如 QBoxLayout),一个简单的方法称为 count() returns 存储在给定容器中的小部件数量。交换 QBoxLayout 或任何 QT 小部件容器的最佳方式是 Gtk::Grid。但是没有简单的方法来获取其中的小部件数量。与 Gtk::Box.

    相同

    我需要该方法来迭代存储在网格中的孩子:

    for(auto& it : layouts) { //layouts is a vector of Gtk::Grids         
        for(int i = 0; i < it->size(); ++i) {                                                                
            if(it->get_child_at(0, i)) {  
                it->get_child_at(0, i)->set_visible((std::string(it->get_name())== StringID));                       
            }
    
  2. QT 使用 QWidget 作为 object 不受限于任何小部件类型(例如按钮或复选框..)。这在 gtkmm 中是不可能的,因为小部件只能通过对小部件类型的引用来初始化。现在我正在寻找用具有小部件向量的 gtkmm 替换 QT 代码。我用 Gtk::Box 来替换 QWidgets。那是一个合理的替代品吗?我在更换他们的规模时遇到了麻烦,最初是使用 QSize 处理的,需要两个数字“高度”和“长度”。现在有一个 Gtk::Scale class,但它以不同的方式工作..

所有 Gtkmm 容器(如 Gtk::Grid)继承自 Gtk::Container,这使得以下方法可用:

std::vector<Widget*> get_children()               // Non const: to modify the widgets
std::vector<const Widget*> get_children () const  // const: for read operations

这些方法 return 正是您想要的:小部件向量。您可以在 returned std::vector 上使用 size() 来计算容器中的 wigets 数量。

此外,在我看来,Gtk::Box 很少有用,因为它非常有限。 Gtk::Grid 几乎总是更好的选择。

最后,在 Qt 中,所有图形元素都继承自 QWidget。在 Gtkmm 中,所有小部件都继承自 Gtk::Widget,这意味着您可以这样写:

Gtk::Widget* pButton = new Gtk::Button("My button");

然后使用 pButton,它“不受任何小部件类型限制”。有关 Gtk::Widget.

的更多信息,请参阅 the reference

Gtkmm4 更新

似乎 Gtk::Container 已在 Gtkmm4 中删除,如记录 here 所示。似乎没有什么可以取代它。不幸的是,在这个版本中,子控件跟踪似乎必须手动完成。