Оптимизация соединений сигналов со слотами

Есть несколько однообразных Qt элементов. Допустим, необходимо сделать так, чтобы при вводе слов в QLineEdit буквы становились заглавными:

self.lineedit1.textChanged.connect(lambda: self.upper(self.lineedit1.text()))
self.lineedit2.textChanged.connect(lambda: self.upper(self.lineedit2.text()))
self.lineedit3.textChanged.connect(lambda: self.upper(self.lineedit3.text()))

Т.к. объектов и их сигналов много, а писать повторяющийся код не хочется, решил добавить имена объектов в список и в цикле соединять сигналы:

temp = [self.lineedit1, self.lineedit2, self.lineedit3]
    for _ in temp:
        _.textChanged.connect(lambda: self.upper(_))

Такой подход не всегда корректно работает. В данном примере - изменяет буквы на заглавные только в self.lineedit3, т.к. итерация заканчивается на нём.

Есть ли способ избавиться от простыни однообразного кода, ибо объектов >100 с 2-3 сигналами на каждом?


Ответы (1 шт):

Автор решения: gil9red

Это особенность лямбд в циклах – если передавать переменную прямо в лямбду, то значение будет только для последней итерации, а чтобы было правильно, нужно в параметр лямбды передавать

Попробуйте так:

temp = [self.lineedit1, self.lineedit2, self.lineedit3]
for x in temp:
    x.textChanged.connect(lambda x=x: self.upper(x.text()))
→ Ссылка