如何将 QSignalMapper 与动态创建的 QActions 一起使用?
How to use QSignalMapper with QActions created dynamically?
我想创建一个动态菜单,它从我的 QMainWindow
中枚举所有 QDockWidget
并允许 show/hide 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 windowTitles,但是当我按下它们时,插槽 toggle_dock_widget
没有被调用。 create_action
是创建 QAction 并将触发信号连接到 slot
的助手。
问题是,我不太了解 QSignalMapper 的工作原理,但我的直觉告诉我它是解决这个特定问题的正确选择。
我可能在这里遗漏了什么?
有一个 built-in dock-widget 菜单。只需 right-click 任何扩展坞 title-bar,或任何 tool-bar 或 menu-bar。参见:QMainWindow::createPopupMenu.
PS:
您的 QSignalMapper
代码不起作用的原因可能是因为您连接到 mapped
信号的错误过载。试试这个:
mapper.mapped[QtWidgets.QWidget].connect(self.toggle_dock_widget)
我想创建一个动态菜单,它从我的 QMainWindow
中枚举所有 QDockWidget
并允许 show/hide 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 windowTitles,但是当我按下它们时,插槽 toggle_dock_widget
没有被调用。 create_action
是创建 QAction 并将触发信号连接到 slot
的助手。
问题是,我不太了解 QSignalMapper 的工作原理,但我的直觉告诉我它是解决这个特定问题的正确选择。
我可能在这里遗漏了什么?
有一个 built-in dock-widget 菜单。只需 right-click 任何扩展坞 title-bar,或任何 tool-bar 或 menu-bar。参见:QMainWindow::createPopupMenu.
PS:
您的 QSignalMapper
代码不起作用的原因可能是因为您连接到 mapped
信号的错误过载。试试这个:
mapper.mapped[QtWidgets.QWidget].connect(self.toggle_dock_widget)