Оптимизация соединений сигналов со слотами
Есть несколько однообразных 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 шт):
Это особенность лямбд в циклах – если передавать переменную прямо в лямбду, то значение будет только для последней итерации, а чтобы было правильно, нужно в параметр лямбды передавать
Попробуйте так:
temp = [self.lineedit1, self.lineedit2, self.lineedit3]
for x in temp:
x.textChanged.connect(lambda x=x: self.upper(x.text()))