我有10个由qt-designer
设计的lineedit小部件,我在我的代码中定义了信号和插槽,
我的问题是在我的代码中重复相同的信号和插槽10次,
像这样的东西:
self.ui.descCode_lineEdit_1.cursorPositionChanged.connect(lambda: self.Desc(1))
self.ui.Desc_lineEdit_1.editingFinished.connect(lambda: self.DescRate(1))
self.ui.descCode_lineEdit_2.cursorPositionChanged.connect(lambda: self.Desc(2))
self.ui.Desc_lineEdit_2.editingFinished.connect(lambda: self.DescRate(2))
...
self.ui.descCode_lineEdit_10.cursorPositionChanged.connect(lambda: self.Desc(10))
self.ui.Desc_lineEdit_10.editingFinished.connect(lambda: self.DescRate(10))
我用getattr
写下这些:
for i in range(1, 11):
getattr(self.ui, 'descCode_lineEdit_{}'.format(i)).cursorPositionChanged.connect(lambda: self.Desc(i))
getattr(self.ui, 'Desc_lineEdit_{}'.format(i)).editingFinished.connect(lambda: self.DescRate(i))
但是当运行代码时,只有第10个小部件的信号和插槽工作正常,其他字段没有。 想知道如何修复这部分代码并重复相同的信号吗?
感谢。
答案 0 :(得分:1)
这里的问题在于lambda和i。稍后只会保存i的最后一个值。因此,请尝试这样:
最小无效示例:
>>> def test(a):
... print a
... x = []
... for i in range(2):
... x.append(lambda: test(i))
... x
14: [<function <lambda> at 0x027FBA30>, <function <lambda> at 0x027FBAF0>]
>>> x[0]() # is supposed to print 0 not 1
1
>>> x[1]()
1
最小工作示例:
>>> def test(a):
... print a
... x = []
... for i in range(2):
... x.append((lambda x: (lambda:test(x)))(i) )
... x
16: [<function <lambda> at 0x027FBBF0>, <function <lambda> at 0x027FBBB0>]
>>> x[0]()
0
>>> x[1]()
1
发生了什么事?
在第二个例子中,我让我的outter lambda
函数返回一个函数。将使用输入lambda
评估out i
函数,返回内置了i
的函数。因此,i
的值将被单独保存,并且事情按预期工作。
<强>解决方案强>
因此,您的解决方案可能如下所示:
for i in range(1, 11):
...connect((lambda x:(lambda: self.Desc(x)))(i))
...connect((lambda x:(lambda: self.DescRate(x)))(i))
干杯!
答案 1 :(得分:0)
使用数据结构可能更容易。
fields = [QLineEdit() for x in range(10)]
for i in range(10):
fields[i].cursorPositionChanged.connect(lambda: self.Desc(i+1))
fields[i].editingFinished.connect(lambda:self.DescRate(i+1))
答案 2 :(得分:0)
试试这段代码: -
for i in range(1,11):
getattr('self.ui.descCode_lineEdit_'+format(i)+'.cursorPositionChanged.connect(lambda: self.Desc('+format(i)+'))')
getattr('self.ui.Desc_lineEdit_'+format(i)+'.editingFinished.connect(lambda: self.DescRate('+format(i)+'))')