如何计算存储在 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 中的小部件下设置所有 Text 小部件的颜色?