2017-05-18 2 views
0

Hallo, ich benutze GTKmm, um eine Anwendung zu schreiben, jedoch kann ich nicht auf bestimmte Menüpunkte von get_children zugreifen.gtk menuitem Baumstruktur

Sie können den Screenshot und das Layout in Lichtung Designer-Schnittstelle in Bild unten

enter image description here

Die Haupt GUI GTKApplicationWindow von einem gtkbuilder geladen wurde sehen, dann sein Zeiger war Vergangenheit auf eine rekursive Funktion, alles zu drucken aus.

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); 
} 

Es erzeugt die Ausgabe unter

.ist Containerebene 1 name: gtkmm__GtkApplicationWindow

.starts Schleifenstufe 1

..ist Containerebene 2 name: gtkmm__GtkBox

..starts loop level 2

... ist Containerebene 3 name: gtkmm__GtkMenuBar

... beginnt Schleifenstufe 3

.... ist Containerebene 4 name: gtkmm__GtkMenuItem

.... beginnt Schleifenstufe 4

..... ist nicht Container-Ebene 5 Name: GtkAccelLabel

.... ist Container-Ebene 4 Name: gtkmm__GtkMenuItem

.... beginnt Schleife Ebene 4

..... ist nicht Container-Ebene 5 Name: GtkAccelLabel

.... ist Container-Ebene 4 Name: gtkmm__GtkMenuItem

.... beginnt Schleifenstufe 4

..... nicht Containerebene 5 Name: GtkAccelLabel

... ist Containerebene 3 name: gtkmm__GtkToolbar

... beginnt Schleifenstufe 3

... ist Containerebene 3 name: gtkmm__GtkNotebook

... beginnt Schleifenstufe 3

........

So kann ich sehen, dass die get_children unterhalb der Menüleiste auf 1 Ebene eintritt, und fand die erste Ebene der MenuItems jedoch unterhalb des menuitem sie nur eine AccelLabel sah, aber nicht die Untermenüs

So zu das Problem weiter untersuchen, verbunden ich einer der Untermenüpunkt Funktion über 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)); 
} 

Und Problem aufgetaucht, die Hauptmenüleiste „nicht Vorfahr“ des Untermenüs. Und stattdessen stellte sich heraus, dass das Elternelement des Elternelements des Untermenüs ein Gtk :: Window war, denn ich denke, es gab keinen ersichtlichen Grund, ich habe nicht einmal ein Gtk :: -Fenster irgendwo auf der Lichtung angegeben. Das Gtk :: -Fenster schien der oberste Vorfahre zu sein, da ->get_parent() Fehler erzeugte.

.ist Containerebene 1 name: GtkWindow

.starts Schleifenstufe 1

..ist Containerebene 2 name: gtkmm__GtkMenu

..starts Schleifenstufe 2

... ist Name der Container-Ebene 3: gtkmm__GtkMenuItem

... startet die Schleifenebene 3

.... ist nicht Container-Ebene 4 Name: GtkAccelLabel

Haben sie etwas in Gtk ändern, die dieses Problem verursacht? Oder habe ich einige Unterlagen nicht richtig gelesen? Das erschien mir total gegensätzlich. Könnte das Problem durch eine fehlende Widget-ID verursacht werden?

Extrakt aus rohen .ui Datei

<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> 

Antwort

0

Mein Bad, sollte ich Gtk::MenuItem::get_submenu()