Python Qt:多个菜单共享相同的操作,但连接到不同的插槽

Python Qt:多个菜单共享相同的操作,但连接到不同的插槽,python,pyqt,pyqt5,qt-signals,qt-slot,Python,Pyqt,Pyqt5,Qt Signals,Qt Slot,我有两个相同动作的菜单。但我想根据菜单将它们连接到不同的插槽。我可以这样做吗 下面的代码无法做到这一点,相反,它将操作连接到两个插槽 我可以用相同的名称创建一组不同的操作。我想知道是否有一种不同的方法可以做到这一点而不重复所有的动作 import sys from PyQt5 import QtWidgets, QtGui, QtCore class MainWindow(QtWidgets.QMainWindow): def __init__(self): supe

我有两个相同动作的菜单。但我想根据菜单将它们连接到不同的插槽。我可以这样做吗

下面的代码无法做到这一点,相反,它将操作连接到两个插槽

我可以用相同的名称创建一组不同的操作。我想知道是否有一种不同的方法可以做到这一点而不重复所有的动作

import sys
from PyQt5 import QtWidgets, QtGui, QtCore


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        centralWidget = QtWidgets.QWidget()
        layout = QtWidgets.QVBoxLayout()
        centralWidget.setLayout(layout)
        self.setCentralWidget(centralWidget)
        self.menuBar = QtWidgets.QMenuBar(self)
        layout.addWidget(self.menuBar)
        self.log = QtWidgets.QTextEdit()
        layout.addWidget(self.log)        

        fileMenu = self.menuBar.addMenu('File')
        editMenu = self.menuBar.addMenu('Edit')
        actions = []
        for i in range(5):
            action = QtWidgets.QAction('{}'.format(i), self)
            actions.append(action)
        fileMenu.addActions(actions)
        editMenu.addActions(actions)
        fileMenu.triggered.connect(self.file_action_triggered)
        editMenu.triggered.connect(self.edit_action_triggered)

    def file_action_triggered(self, action):
        print('File', action.text())
        self.log.append('File' + action.text())

    def edit_action_triggered(self, action):
        print('Edit', action.text())
        self.log.append('Edit' + action.text())


def main():
    app = QtWidgets.QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
当运行上述代码并单击“File-1”时,我只希望

File1
待打印。相反,它会打印

File1
Edit1

您尚未创建具有相似名称的QActions,这些名称已将相同QActions分配给2个QMenu。您应该做的是创建两个具有相同文本的QAction,并将每个QAction分配给不同的QMenu

例如:

for i in range(5):
    fileMenu.addAction(QtWidgets.QAction('{}'.format(i), self))
    editMenu.addAction(QtWidgets.QAction('{}'.format(i), self))

您尚未创建具有相似名称的QActions,这些名称已将相同QActions分配给2个QMenu。您应该做的是创建两个具有相同文本的QAction,并将每个QAction分配给不同的QMenu

例如:

for i in range(5):
    fileMenu.addAction(QtWidgets.QAction('{}'.format(i), self))
    editMenu.addAction(QtWidgets.QAction('{}'.format(i), self))

您的问题不清楚,请解释。您尚未创建具有相似名称的QActions,这些QActions已将相同的QActions分配给2个QMenus。除了你想解决的问题之外,我还想知道“是否有一种不同的方法可以在不重复所有操作的情况下完成”。我完全可以创建另一个n个动作,它看起来与我之前创建的n个动作完全相同。但是,由于是菜单发出信号(而不是动作本身),我能否以某种方式让插槽知道信号是从哪个菜单发出的?您的问题不清楚,请解释。您没有创建具有类似名称的QActions,它们将相同的QActions分配给2个QMenus。除了你想解决的问题之外,我还想知道“是否有一种不同的方法可以在不重复所有操作的情况下完成”。我完全可以创建另一个n个动作,它看起来与我之前创建的n个动作完全相同。但是,既然是菜单发出信号(而不是动作本身),我能不能让插槽知道信号是从哪个菜单发出的?发出信号的对象不是菜单,它们是QActions,所以不可能按你说的做。发出信号的对象不是菜单,它们是QActions,所以你说的是不可能做到的。