Hi there I am using GTKmm to write an application, however I cannot access certain menuitem from get_children.
You can see the screen shot and layout in glade designer interface in picture below
The Main GUI GTKApplicationWindow was loaded by a gtkbuilder, then its pointer was past to a recursive function to print everything out.
void loopchildren(Gtk::Widget* parent, int level){
level++;
if (GTK_IS_CONTAINER(parent->gobj())){
std::cout << std::string(level, '.') << "is container level " << level << " name: " <<parent->get_name() << std::endl;
Gtk::Container* contain = dynamic_cast<Gtk::Container*>(parent);
std::vector<Gtk::Widget*> childrens = contain->get_children();
std::cout << std::string(level, '.') << "starts loop level " << level << std::endl;
for(auto const& value: childrens){
loopchildren(value, level);
}
}else{
std::cout << std::string(level, '.') << "is not container level " << level << " name: "<< parent->get_name() << std::endl;
}
}
MyApplicationWindow::MyApplicationWindow(Glib::RefPtr<Gtk::Builder> builder, Glib::ustring baseWidgetName){
thisBaseWidgetPointer = this;
builder->get_widget(baseWidgetName, thisBaseWidgetPointer);
loopchildren(thisBaseWidgetPointer, 0);
}
It produced the output below
.is container level 1 name: gtkmm__GtkApplicationWindow
.starts loop level 1
..is container level 2 name: gtkmm__GtkBox
..starts loop level 2
...is container level 3 name: gtkmm__GtkMenuBar
...starts loop level 3
....is container level 4 name: gtkmm__GtkMenuItem
....starts loop level 4
.....is not container level 5 name: GtkAccelLabel
....is container level 4 name: gtkmm__GtkMenuItem
....starts loop level 4
.....is not container level 5 name: GtkAccelLabel
....is container level 4 name: gtkmm__GtkMenuItem
....starts loop level 4
.....is not container level 5 name: GtkAccelLabel
...is container level 3 name: gtkmm__GtkToolbar
...starts loop level 3
...is container level 3 name: gtkmm__GtkNotebook
...starts loop level 3
........
So I can see that the get_children enters to 1 level below the MenuBar, and found the first level of menuItems, however below the menuitem they only saw an AccelLabel, but not the sub menus
So to further investigate the problem, I connected one of the sub menu item to a function via signal
Gtk::MenuItem* menuItem;
Gtk::MenuItem* menuItem2;
Gtk::MenuBar* mmbar;
void add2(){
std::cout << (menuItem->is_ancestor(*mmbar) ? "is ancestor" : "not ancestor ") <<std::endl;
std::cout << menuItem->get_parent()->get_parent()->get_name() <<std::endl;
loopchildren(menuItem->get_parent()->get_parent(), 0);
}
MyApplicationWindow::MyApplicationWindow(){
builder->get_widget("main_menu_bar", mmbar);
builder->get_widget("menu_basic_company", menuItem);
menuItem->signal_activate().connect(sigc::ptr_fun(&add2));
}
And problem surfaced, the main menubar is "not ancestor" of the sub menu. And instead the parent of the parent of the sub menu item turned out to be a Gtk::Window, for I think no apparent reason, I didn't even specifie a Gtk::window anywhere in the glade ui. That Gtk::window seemed the topmost ancestor as any more ->get_parent() produced error.
.is container level 1 name: GtkWindow
.starts loop level 1
..is container level 2 name: gtkmm__GtkMenu
..starts loop level 2
...is container level 3 name: gtkmm__GtkMenuItem
...starts loop level 3
....is not container level 4 name: GtkAccelLabel
Did they change something in Gtk that caused this problem? Or did I not read some documentation properly? This seemed totally counter intuitive to me. Could the problem be caused by a lack of widget id?
extract of raw .ui file
<object class="GtkApplicationWindow" id="window1">
<property name="can_focus">False</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkMenuBar" id="main_menu_bar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem" id="menu_sys">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">系統</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">系統設定</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkMenuItem">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">關閉</property>
<property name="use_underline">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menu_basic">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">基礎數據</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem" id="menu_basic_company">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">公司</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menu_basic_supplier">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">供應商</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menu_basic_supplier_warehouse">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">倉庫</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menu_basic_shop">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">店舖</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menu_basic_product2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">商品資料</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem" id="menu_basic_product_brand">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">品牌</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menu_basic_product_category">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">分類</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menu_basic_product_line">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">系列</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menu_basic_product_gender">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">性別</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menu_basic_product_colour">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">顏色</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menu_basic_product_sizegroup">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">尺寸組</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menu_basic_product_sizeratio">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">尺寸比例</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menu_basic_product_userdefineproperties">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">自訂屬性</property>
<property name="use_underline">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menu_basic_staff">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">雇員</property>
<property name="use_underline">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menu_product">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">商品</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem" id="menu_product_main">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">商品主檔案</property>
<property name="use_underline">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkToolbar">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkNotebook" id="mainnb">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
