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

Posted

技术标签:

【中文标题】如何计算存储在 Gtk::Grid 中的小部件?【英文标题】:How can I count the widgets stored in a Gtk::Grid? 【发布时间】:2021-06-06 08:47:41 【问题描述】:

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

    给定 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));                       
            
    

    QT 使用QWidget 作为不受任何小部件类型(例如按钮或复选框..)限制的对象。这在 gtkmm 中是不可能的,因为小部件只能通过对小部件类型的引用来初始化。现在我正在寻找用 gtkmm 替换 QT 代码,它有一个小部件向量。我用 Gtk::Box 替换了 QWidgets。这是一个合理的替代吗?我在更换他们的规模时遇到了麻烦,最初是使用QSize 处理的,需要两个数字“hight”和“lenght”。现在有一个Gtk::Scale 类,但它以不同的方式工作..

【问题讨论】:

【参考方案1】:

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

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

另外,在我看来,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 所示。似乎没有什么可以替代它。不幸的是,在这个版本中,子小部件跟踪必须手动完成。

【讨论】:

非常感谢您的解决方案。不幸的是,在我的gtkmm版本中,没有Gtk::Container这样的类,从而产生了未知成员get_children()的错误。我检查了Gtk::Grid 参考并确认 Gtk::Container 不再是一个东西。Gtk::Grid reference 你的版本是什么? 3.24.3-3。 atm 无法升级 是的,我也检查过了,这真的很奇怪。我将检查我的编译器设置。再次感谢您的解决方案! 顺便说一下,查看this page 以确保为您的 Gtkmm 版本选择正确的参考。您在上面为Gtk::Grid 提供的链接是“稳定”版本,即 4.0.1。不幸的是,Gtkmm API 从第 3 版到第 4 版发生了巨大变化:-(

以上是关于如何计算存储在 Gtk::Grid 中的小部件?的主要内容,如果未能解决你的问题,请参考以下文章

在 Gtk::Grid 中移动 Gtk::Widget 的位置

在 Flutter 中的小部件之间传递数据的最佳方式

如何在 Flutter 中的小部件下设置所有 Text 小部件的颜色?

来自 Room 的小部件中的 setImageViewUri

如何隐藏博客标签搜索中的小部件

Kivy 如何访问子小部件中的小部件