2017-05-18 15 views
0

こんにちは私はGTKmmを使ってアプリケーションを書いていますが、get_childrenから特定のmenuitemにアクセスすることはできません。gtk menuitemツリー構造

あなたがメインGUI GTKApplicationWindowがgtkbuilderによってロードされた

enter image description here

下の写真の空き地デザイナーインタフェースのスクリーンショットおよびレイアウトを見ることができ、そのポインタはすべてを印刷するには再帰関数に過ぎでしたでる。 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> 

答えて

0

私の悪い、私はGtk::MenuItem::get_submenu()

を使用する必要があります