2014-09-23 37 views
2

您好所有內重新使用QMenu,多個Qmenu

       我有一些碼生成取決於一些數據的動態填充QMenu(I將其稱爲thisMenu)。創建QMenu thisMenu,將一些「main」QWidget作爲父項並添加到QWidget中的QMenuBar(menuBar.addMenu(&thisMenu)。後面,我希望用戶能夠從上下文菜單中訪問thisMenu用戶右鍵點擊一個子菜單QWidget的,它會彈出一個QMenu(稱爲文本菜單),還有一些動作,而以前QMenu的某些部分)。

       如果我再利用我第一次創建QMenu與contextMenu.addMenu(&thisMenu)我發現,即使contextMenu在正確的全局位置彈出,此菜單總是會翻譯爲其他位置,並且有時在上面顯示,有時在contextMenu下。

         我可以測試,這是鏈接到父母鏈:thisMenu不是contextMenu的孩子,如果我創建它的contextMenu的孩子,一切都很好。有沒有一種乾淨的處理這種情況,而不重新創建類似於thisMenu的QMenu,或者更改thisMenu的父級;即在QMenuBar和某些上下文菜單/ QMenu中重複使用thisMenu?在其他方面,處理QMenu育兒鏈和共享QMenu的正確方式是什麼?

       謝謝

回答

3

在其他什麼處理養育鏈QMenu和共享QMenu的正確方法?

您不能在多個地方共享QMenu--每個QMenu一次只能在一個地方存在。您應該創建單獨的QMenus:一個用於您的菜單欄,另一個用於您的上下文菜單。

一個簡單的方法是將菜單生成代碼放在for循環中,以創建多個相同的菜單。

請問爲什麼要重用QMenu?

我可以測試,這是鏈接到育兒鏈:thisMenu不

沒錯,就是文檔中描述的ContextMenu

的孩子。當你添加一個QMenu到另一個,父母不會改變: http://qt-project.org/doc/qt-5/QMenu.html#addMenu

如果我創建它的孩子contextMenu,一切都很好。

小部件的位置始終繪製在相對於其父項的位置。 (記住:一個QMenu是一個QWidget)

2

JKSH的答案,我決定用一個函數來複制QMenu,沒有它複製的QAction(它們不是繼承了QWidget),從而節省所有已建立的連接:

void duplicateMenu(QMenu* dst, QMenu& origin) 
{ 
    QMenu* sub = dst->addMenu(origin.title()); 
    QList<QAction*> actions=origin.actions(); 

    for(QList<QAction*>::iterator it=actions.begin(); it!=actions.end(); it++) 
    { 
     QMenu* itMenu = (*it)->menu(); 

     if(itMenu!=NULL) 
      duplicateMenu(sub, *itMenu); 
     else 
      sub->addAction(*it); 
    } 
}