首页 > 解决方案 > 如何计算存储在 Gtk::Grid 中的小部件?

问题描述

我正在寻找与某些 QT 表达式等效的几种 gtkmm 方法/数据类型:

  1. 给定 QT 中的小部件容器(例如QBoxLayout),一个简单的方法调用count()返回存储在给定容器中的小部件数量。交换 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. QTQWidget用作不受任何小部件类型(例如按钮或复选框..)限制的对象。这在 gtkmm 中是不可能的,因为小部件只能通过对小部件类型的引用来初始化。现在我正在寻找用 gtkmm 替换 QT 代码,它有一个小部件向量。我用 Gtk::Box 替换了 QWidgets。这是一个合理的替代吗?我在更换他们的规模时遇到了麻烦,最初是使用 处理的QSize,期望两个数字“hight”和“lenght”。现在有一个Gtk::Scale类,但它以不同的方式工作..

标签: gtkmm

解决方案


所有 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

这些方法准确地返回你想要的:一个小部件向量。您可以使用size()返回std::vector来计算容器中的假发数量。

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

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

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

然后使用pButton,它“不受任何小部件类型的限制”。有关更多信息,请参阅参考资料Gtk::Widget


Gtkmm4 更新

它似乎Gtk::Container在 Gtkmm4 中被删除,如此所述。似乎没有什么可以替代它。不幸的是,在这个版本中,子小部件跟踪必须手动完成。


推荐阅读