2017-07-20 49 views
0

我有兩個具有相同動作的菜單。但是我想根據菜單將它們連接到不同的插槽。我可以這樣做嗎?Qt:多個菜單共享相同的動作,但連接到不同的插槽

以下代碼無法執行此操作,而是將操作連接到兩個插槽。

我可以使用相同的名稱創建一組不同的操作。我想知道是否有不同的方式來做到不重複所有的行爲。

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() 

當運行上面的代碼,然後點擊 「文件 - 1」,我希望只

File1 

進行打印。相反,它打印

File1 
Edit1 
+0

你的問題不清楚,請解釋。 – eyllanesc

+0

您尚未創建具有相同名稱的QActions,它們將相同的QActions分配給2個QMenus。除了這個問題你想要做什麼? – eyllanesc

+0

我很想知道「是否有不同的方法來做到這一點,而不需要重複所有的動作」。我完全可以創建另外n個與我之前創建的n個動作完全相同的動作。但是,由於它是發出信號的菜單(不是動作本身),我能否以某種方式讓插槽知道信號從哪個菜單中刪除? – azalea

回答

0

您尚未創建具有相同名稱的QActions,它們將相同的QActions分配給2個QMenus。你應該做的是用相同的文本創建2個QAction,並將其分配給不同的QMenu。

例如:

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

發出信號的對象不是菜單,它們是QActions,所以不可能做你說的話。 – eyllanesc

相關問題