pyqt4中相同宽度的重复信号和时隙

2024-09-30 12:32:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

谢谢。你知道吗


Tags: lambda代码selfuisignal部件connectdesc
3条回答

这里的问题在于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

发生了什么?

在第二个例子中,我让outterlambda函数返回一个函数。outterlambda函数将由输入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))

干杯!你知道吗

使用数据结构可能更容易。你知道吗

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))

试试这个代码:-你知道吗

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

相关问题 更多 >

    热门问题