如何测试 get_children() 返回的小部件类型?
how to test the type of the widgets returned by get_children()?
在 Gtk::Container
returns std::vector<Gtk::Widget*>
(容器包含的小部件)上使用 get_children()
。
a Gtk::Entry
继承自 Gtk::Widget
。当然,像 get_text()
这样的特定 Gtk::Entry
函数不能被 Gtk::Widget
.
调用
为了解决这个问题,我可以将Gtk::Widget
转换为Gtk::Entry
,但是你现在看到问题了,如果容器中有其他小部件我该如何处理,比如说Gtk::Button
?
for ( auto* widgetOfTheEvilDead : ContainerCoffin->get_children() )
{
if ( widgetOfTheEvilDead->get_visible() /*shared by all widget*/ )
{
// do something if i'm an entry, e.g.:
text = static_cast<Gtk::Entry*>( widgetOfTheEvilDead )->get_text();
if ( text == "Rotting Christ")
this->music->play("Lucifer Over Athens");
}
}
为了完整起见,在我的例子中,我没有使用 Gtk::Entry
,而是我自己的小部件继承自 Gtk::Entry
:
class Tombstone
: public Gtk::Entry
{
.
.
.
}
这就是 dynamic_cast
的用途:
if (auto p = dynamic_cast<Gtk::Entry*>(widgetOfTheEvilDead)) {
test = p->get_text();
}
在 Gtk::Container
returns std::vector<Gtk::Widget*>
(容器包含的小部件)上使用 get_children()
。
a Gtk::Entry
继承自 Gtk::Widget
。当然,像 get_text()
这样的特定 Gtk::Entry
函数不能被 Gtk::Widget
.
为了解决这个问题,我可以将Gtk::Widget
转换为Gtk::Entry
,但是你现在看到问题了,如果容器中有其他小部件我该如何处理,比如说Gtk::Button
?
for ( auto* widgetOfTheEvilDead : ContainerCoffin->get_children() )
{
if ( widgetOfTheEvilDead->get_visible() /*shared by all widget*/ )
{
// do something if i'm an entry, e.g.:
text = static_cast<Gtk::Entry*>( widgetOfTheEvilDead )->get_text();
if ( text == "Rotting Christ")
this->music->play("Lucifer Over Athens");
}
}
为了完整起见,在我的例子中,我没有使用 Gtk::Entry
,而是我自己的小部件继承自 Gtk::Entry
:
class Tombstone
: public Gtk::Entry
{
.
.
.
}
这就是 dynamic_cast
的用途:
if (auto p = dynamic_cast<Gtk::Entry*>(widgetOfTheEvilDead)) {
test = p->get_text();
}