2016-12-15 1 views
1

J'aimerais créer un menu dynamique qui énumère tous QDockWidget de mon QMainWindow et permet de montrer/cacher la QDockWidgets, jusqu'à présent, je suis arrivé ce code:Comment utiliser QSignalMapper avec QActions créé dynamiquement?

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

Le menu est rempli avec tous QDockWidget mais windowTitles quand je presse chacun d'entre eux, le slot toggle_dock_widget n'est pas appelé. create_action est un assistant qui crée le QAction et connecte le signal déclenché à slot. Le fait est que je ne comprends pas très bien comment fonctionne QSignalMapper mais mon intuition me dit que c'est le bon choix pour ce problème particulier.

Que pourrais-je manquer ici?

Répondre

2

Il existe déjà un menu dock-widget intégré. Cliquez avec le bouton droit de la souris sur n'importe quelle barre de titre du dock ou sur n'importe quelle barre d'outils ou barre de menu. Voir: QMainWindow::createPopupMenu.

PS:

La raison pour laquelle votre code QSignalMapper ne fonctionne pas est probablement parce que vous connectez à la mauvaise surcharge du signal mapped. Essayez ceci à la place:

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

Oui, merci de le signaler. Après avoir posé ma question, j'avais découvert que celui-ci était intégré. Pourtant, je suis assez intéressé à comprendre ce qui ne va pas avec mon extrait de sorte que la prochaine fois je sais beaucoup mieux comment utiliser correctement qsignalmapper. Une idée? +1 – BPL

+0

@BPL. Voir ma réponse mise à jour. – ekhumoro

+0

Merci, c'était tout! – BPL