pyqt4中相同宽度的重复信号和插槽

时间:2013-06-19 05:47:07

标签: python python-3.x pyqt4

我有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个小部件的信号和插槽工作正常,其他字段没有。 想知道如何修复这部分代码并重复相同的信号吗?

感谢。

3 个答案:

答案 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)+'))')