2016-12-15 1 views
1

나는이 코드를 가지고 지금까지, 내 ​​QMainWindow 모든 QDockWidget을 열거하고/보여 QDockWidgets을 숨길 수있는 동적 메뉴를 만드는 싶습니다동적으로 생성 된 QAction을 사용하여 QSignalMapper를 사용하는 방법은 무엇입니까?

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_widget 슬롯이 호출되지 않는다. create_action은 QAction을 생성하고 트리거 된 신호를 slot에 연결하는 도우미입니다.

문제는 QSignalMapper가 어떻게 작동하는지 잘 모르지만 내 직감은이 특정 문제에 대해 올바른 선택이라고 말해줍니다.

여기에 무엇이 누락 될 수 있습니까?

답변

2

aleady에 내장 된 독 - 위젯 메뉴가 있습니다. 독 제목 바 또는 툴바 또는 메뉴 바를 마우스 오른쪽 버튼으로 클릭하면됩니다. 참조 : QMainWindow::createPopupMenu.

PS :

당신이 mapped 신호의 잘못된 과부하에 연결되어 있기 때문에 작동하지 않는 QSignalMapper 코드가 아마 이유. 대신 다음을 시도하십시오.

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

예, 감사합니다. 내 질문을 한 후에 나는 내장 된 것을 발견했다. 그럼에도 불구하고 나는 다음에 아는 사람이 qsignalmapper를 올바르게 사용하는 방법을 더 잘 알 수 있도록 내 발췌 문장에 무엇이 잘못되었는지 알아내는 것에 관심이 많습니다. 어떤 생각? +1 – BPL

+0

@ BPL. 내 업데이트 답변을 참조하십시오. – ekhumoro

+0

고맙습니다. 그게 다야! – BPL