如何将QSignalMapper与动态创建的QActions一起使用?

时间:2016-12-15 02:48:35

标签: python pyqt pyqt5 qsignalmapper

我想创建一个动态菜单,列出我QDockWidget中的所有QMainWindow,并允许显示/隐藏QDockWidgets,到目前为止,我得到了此代码:< / p>

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是如何工作的,但我的直觉告诉我这是解决这一特定问题的正确选择。

我在这里可以缺少什么?

1 个答案:

答案 0 :(得分:2)

有一个内置的dock-widget菜单。只需右键单击任何停靠栏标题栏,或任何工具栏或菜单栏。请参阅:QMainWindow::createPopupMenu

PS:

您的QSignalMapper代码不起作用的原因可能是因为您连接到mapped信号的错误重载。试试这个:

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