0

我有 10 个由 lineedit 设计的小部件,qt-designer我在代码中定义了信号和插槽,我的问题是在我的代码中重复相同的信号和插槽 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 个小部件的信号和插槽工作正常,其他字段没有。知道如何修复这部分代码并重复相同的信号吗?

谢谢。

4

3 回答 3

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

怎么了?

在第二个示例中,我让外部lambda函数返回一个函数。外部lambda函数将使用输入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))

干杯!

于 2013-06-19T06:15:08.457 回答
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)+'))')
于 2013-06-19T06:22:13.637 回答
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))
于 2013-06-19T06:11:06.083 回答