2016-11-28 44 views
1

我正在使用python3和PyQt4。我想創建一個帶有動作的菜單,其數量根據數組而不同。我希望每個人都將保存在數組中的相應信息保存到變量中。創建可變數量的事件似乎不可能。那麼,如何根據它被激活的動作創建一個不同的工作事件? 那是我的代碼:如何根據文件創建QActions及其信號

def buildLoadSettings(self): 
    self.settings = array 
    for i in range(len(self.settings)): 
     exec("self.settings" + str(i) + " = QtGui.QAction('" + self.settings[i][0] + "', self)") 
     exec("self.loadMenu.addAction(self.settings" + str(i) + ")") 

我想每一個動作與事件連接,並最終拯救‘self.settings [I] [1]’的變量‘設置’。 對不起,我的新手問題。

+0

請解釋你的問題,請 – eyllanesc

+0

我只是想創建多個動作,包含可變數字和一個事件,它知道它被調用的是哪個動作,以便它選擇相應的數據。 ekhumoro給出了確切的解決方案。 –

回答

1

這並不完全清楚你想要實現什麼,但有幾個API應該有所幫助。目前肯定沒有必要使用醜陋的電話exec

這裏有一些想法:

  1. 使用QAction.setData()一些數據與每個操作相關聯:

    for item in self.settings: 
         action = QtWidgets.QAction(item[0], self) 
         action.setData(item[1]) 
         self.loadMenu.addAction(action) 
    
  2. 使用QMenu.actions()訪問的行動,而不是創建屬性:

    action = self.loadMenu.actions()[2] 
        print((action.text(), action.data())) 
    
  3. 連接一個slo噸至QMenu.triggered()處理一切行動在一個地方:

    self.loadMenu.triggered.connect(self.handleLoadMenu) 
    
    def handleLoadMenu(self, action): 
        # "action" is the action that was clicked 
        text = action.text() 
        data = action.data() 
        print('Action Clicked: ("%s", %s)' % (text, data)) 
    

PS:

如果你想獲得/設置動態屬性,使用getattrsetattr

# self.settings2 = action 
    setattr(self, "settings%s" % 2, action) 
    # action = self.settings2 
    action = getattr(self, "settings%s" % 2)