QtCore.QObject.connect в цикле влияет только на последний экземпляр

У меня есть петля. Я создал QCheckBox и поместил его в ячейку QTableWidget , и все в порядке. На каждом шаге цикла я вызывал функцию connect , для SLOT-слота myslot, но применяется только последний экземпляр QCheckBox . Я много гугл и обнаружил, что у многих людей есть моя проблема. Я применил их решения, но моя проблема остается.

 for row in xrange(len(uniqueFields)): instance = QtGui.QCheckBox(uniqueFields[row], findInstance.tableWidget) print QtCore.QObject.connect(instance, QtCore.SIGNAL(_fromUtf8("stateChanged (int)")), lambda: findInstance.projectsInstance.myslot( "TWCH", findInstance, instance.text(), instance.checkState(), instance)) findInstance.tableWidget.setRowCount(findInstance.tableWidget.rowCount() + 1) findInstance.tableWidget.setCellWidget(row, 0, instance) 

Примечание: моя функция connect возвращает True .

Как создать функцию connect в цикле, который перечисляет все instances ?

    У меня такая же проблема, вы должны использовать functools.partial например:

     for key, val in a_DICT_THAT_YOU_STORED_YOUR_OBJECTS_AND_STRINGS: obj = partial( findInstance.projectsInstance.myslot,arg1="TWCH",arg2=self,arg3=key,arg4=val.checkState() ) QtCore.QObject.connect(val, QtCore.SIGNAL(_fromUtf8("stateChanged (int)")), obj) 

    Конечно, argX должен установить ваше настоящее имя вашего аргумента имени вашей функции.

    Поместите переменную цикла в аргумент по умолчанию, например:

     lambda state, instance=instance: findInstance.projectsInstance.myslot( "TWCH", findInstance, instance.text(), instance.checkState(), instance) 

    Это даст каждой lambda свою собственную локальную копию переменной instance .

    РЕДАКТИРОВАТЬ

    Вот простой скрипт, демонстрирующий, как использовать аргументы lambda по умолчанию:

     from PyQt4 import QtGui class Window(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__(self) layout = QtGui.QVBoxLayout(self) for index in range(4): instance = QtGui.QCheckBox('Checkbox(%d)' % index, self) instance.stateChanged.connect( lambda state, instance=instance: self.mySlot(instance.text())) layout.addWidget(instance) def mySlot(self, text): print('clicked: %s' % text) if __name__ == '__main__': import sys app = QtGui.QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_()) 

    Проблема в том, что вы создаете функцию, используя lambda где некоторые из переменных внутри функции не передаются в качестве аргументов функции. Когда функция lambda выполняется, когда сигнал испускается, он использует значение этих переменных (например, instance ) в этот момент времени. Чтобы быть ясным, каждая сделанная вами lambda-функция использует значение instance во время выполнения, а не определяет время. Таким образом, instance содержит только ссылку на объект, используемый в последней итерации нашего цикла, что объясняет поведение, которое вы видите.

    Некорую полезную информацию можно найти здесь (читайте также комментарии) http://eli.thegreenplace.net/2011/04/25/passing-extra-arguments-to-pyqt-slot/

    Из комментариев приведенной выше ссылки:

    То, что вы можете сделать, это заставить другую функцию генерировать lambda, то есть нечто вроде:

     def make_callback(param): return lambda: self.on_button(param) 

    И в связи вызовите make_callback(i) . Затем для каждой итерации создается другая lambda.

    Поэтому вы хотели бы обобщить это и передать вещи, подобные instance функции make_callback а затем поместить свое определение lambda внутри функции make_callback . Я бы дал наглядный пример этого, но, как говорится в другом ответе, ваше форматирование, похоже, очень запуталось в вашем вопросе, и я, скорее всего, ошибусь в вашем конкретном приложении. Если вы не следуете тому, что я сказал, сделайте код в своем вопросе более ясным, и я попробую создать пример!

    Давайте будем гением компьютера.