Как использовать 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)