2016-12-15 45 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