Как использовать QSignalMapper с QActions, созданным динамически?

Я хотел бы создать динамическое меню, которое перечисляет все QDockWidget от моего QMainWindow и позволяет показать / скрыть QDockWidgetsДо сих пор я получил этот код:

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, но когда я нажимаю на каждый из них, слот toggle_dock_widget не называется. create_action является помощником, который создает QAction и подключает сработавший сигнал к slot,

Дело в том, что я не очень хорошо понимаю, как работает QSignalMapper, но моя интуиция подсказывает мне, что это правильный выбор для этой конкретной проблемы.

Чего мне здесь не хватает?

1 ответ

Решение

Есть встроенное меню виджетов. Просто щелкните правой кнопкой мыши по любой строке заголовка дока, любой панели инструментов или строке меню. Смотрите: QMainWindow:: createPopupMenu.

PS:

Причина, по которой ваш QSignalMapper код не работает, вероятно, потому что вы подключаетесь к неправильной перегрузке mapped сигнал. Попробуйте это вместо этого:

    mapper.mapped[QtWidgets.QWidget].connect(self.toggle_dock_widget)
Другие вопросы по тегам