こんにちは私はGTKmmを使ってアプリケーションを書いていますが、get_childrenから特定のmenuitemにアクセスすることはできません。gtk menuitemツリー構造
あなたがメインGUI GTKApplicationWindowがgtkbuilderによってロードされた
下の写真の空き地デザイナーインタフェースのスクリーンショットおよびレイアウトを見ることができ、そのポインタはすべてを印刷するには再帰関数に過ぎでしたでる。 gtkmm__GtkApplicationWindow
.startsループレベル1
コンテナレベル2名を..is:gtkmm__GtkBox
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);
}
それは
以下の出力をコンテナレベル1名.is生成しました
..開始ループレベル2
...コンテナレベル3名れる:gtkmm__GtkMenuBar
は...ループレベル3
を開始....コンテナレベル4名である:gtkmm__GtkMenuItem
は....ループレベル4を開始GtkAccelLabel
は....コンテナレベル4名である:gtkmm__GtkMenuItem
は..... 5名コンテナレベルではありません
は....コンテナレベル5名ない.....ループレベル4
を開始:GtkAccelLabel
....コンテナレベル4名である:gtkmm__GtkMenuItem
....開始ループレベル4
は.....コンテナレベル5名ではありません。gtkmm__GtkToolbar
:GtkAccelLabel...は、コンテナレベル3名です。...ループレベル3
を開始...コンテナレベル3名れる:gtkmm__GtkNotebook
は...ループレベル3
を開始します........
だから私は
へだからサブメニューget_childrenは、メニューバー下の1つのレベルに入ることを確認し、メニューアイテムの最初のレベルを発見した、しかし、彼らは唯一のAccelLabelを見たメニュー項目以下のことはできませんが、さらに問題を調査、私は信号を介して機能にサブメニュー項目のいずれかを接続
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));
}
、問題表面化し、メインメニューバーには、サブメニューの「ない祖先」です。代わりに、サブメニュー項目の親の親がGtk :: Windowであることが判明しました。私は明白な理由はないと思っていました。私はGlade UIのどこにでもGtk :: windowを指定しませんでした。そのGtk ::ウィンドウはもう一度最上位の祖先に見えました。->get_parent()
でエラーが発生しました。
コンテナレベル1名を.is:のGtkWindow
.startsループレベル1
は、コンテナレベル2名..is:gtkmm__GtkMenu
..startsループレベル2
...コンテナレベル3の名前です:gtkmm__GtkMenuItem
...ループレベル3を開始します
....コンテナレベル4名ではありません。GtkAccelLabel
彼らはこの問題の原因となったのGtkで何かを変更しましたか?それとも、私はいくつかの文書を正しく読まなかったのですか?これは全く私にとって直観的ではないようでした。問題はウィジェットIDがないために発生する可能性がありますか?生の.uiファイルの
エキス
<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>