2016-12-15 66 views
1

我想創造出列舉從我QMainWindow所有QDockWidget並允許顯示/隱藏QDockWidgets動態菜單,到目前爲止,我得到這個代碼:如何使用QSignalMapper動態創建QActions?

class PluginActionsViewDocks(): 

    def __init__(self, main_window): 
     self.main_window = main_window 

     mapper = QSignalMapper(self.main_window) 

     self.actions = [] 
     for dock in main_window.findChildren(QtWidgets.QDockWidget): 
      action = create_action(
       main_window, dock.windowTitle(), 
       slot=mapper.map, 
       tooltip='Show {0} dock'.format(dock.windowTitle()) 
      ) 
      mapper.setMapping(action, dock) 
      self.actions.append(action) 

     mapper.mapped.connect(self.toggle_dock_widget) 
     help_menu = main_window.menuBar().addMenu('&View') 
     setattr(help_menu, "no_toolbar_policy", True) 
     add_actions(help_menu, tuple(self.actions)) 

    def toggle_dock_widget(self, dock_widget): 
     print("toggle_dock_widget") 

菜單中填充了所有QDockWidget windowTitles但當我按下他們中的每一個時,不調用插槽toggle_dock_widgetcreate_action是創建QAction並將觸發信號連接到slot的幫手。

問題是,我並不十分清楚QSignalMapper的工作原理,但我的直覺告訴我這是針對這個特定問題的正確選擇。

我在這裏可能會錯過什麼?

回答

2

有一個內置的dock-widget菜單。只需右鍵單擊任何停靠標題欄或任何工具欄或菜單欄。參見:QMainWindow::createPopupMenu

PS:

之所以你QSignalMapper代碼不起作用,可能是因爲您連接到mapped信號錯誤的過載。試試這個:

mapper.mapped[QtWidgets.QWidget].connect(self.toggle_dock_widget) 
+0

是的,謝謝指出。在問我的問題後,我發現了內建的問題。儘管如此,我還是非常想知道我的代碼片段有什麼問題,所以下次生病了解如何正確使用qsignalmapper時會更好。任何想法? +1 – BPL

+0

@BPL。看到我更新的答案。 – ekhumoro

+0

謝謝,就是這樣! – BPL