2016-11-28 13 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 [я] [1]“ до „настройки“ переменных. Извините за мой вопрос.

+0

объясните свой вопрос, пожалуйста – eyllanesc

+0

Я просто хотел создать несколько действий с переменным числом и событием, которое знает, какое действие оно вызвало, так что оно ses соответствующие данные. эхуморо дал точное решение. –

ответ

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:

Если вы хотите получить/установить атрибуты динамически, используйте getattr и setattr:

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