2013-01-05 2 views
5

다음 문제가 발생합니다. 결국 여분의 데이터를 전달하기 위해 람다 함수를 Signal에 연결하려고합니다. 내가 createTimeComboBox(),을 실행하면PyQT 신호에 람다 함수 연결

def createTimeComboBox(self,slotCopy): 
    timeComboBox = QComboBox() 

    #... 

    cmd = lambda func=self.test:func() 
    self.connect(timeComboBox, SIGNAL("currentIndexChanged(int)"),cmd) 

#... 

def test(self, value): 
    print value 

는이 오류 얻을 :

TypeError: 'int' object is not callable 

self.connect(timeComboBox, SIGNAL("currentIndexChanged(int)"),self.test) 

잘 작동

self.connect(timeComboBox, SIGNAL("currentIndexChanged(int)"),cmd) 

변경을,하지만 난 수 있도록하고 싶습니다를 전달하십시오.변수도 마찬가지이므로 lambda 접근 방식을 사용해야한다고 가정합니다.

이전에 QPushButtonclicked() 신호로이 작업을 수행했는데 정상적으로 작동했습니다.

def createToDoctorButton(self,extraData): 
    toDoctorButton = QPushButton() 

    cmd = lambda func=self.goToDoctor:func(extraData) 
    self.connect(toDoctorButton, SIGNAL('clicked()'),cmd) 

    return toDoctorButton 

def goToDoctor(self,extraData): 
    print extraData 

누구나 아이디어가 있습니까? 어떤 제안을 주셔서 감사합니다! 건배 데이브이 당신을 위해 작동하는 경우

답변

5

귀하의 lambda : 여기

timeComboBox.currentIndexChanged.connect(self.test) 

가와 람다없이 새로운 스타일 신호/슬롯 연결을 보여주는 작은 작업 예입니다 매개 변수 ( func)를 허용합니다.

lambda func=self.test:func() 

매개 변수에 기본값이 있지만 매개 변수가 전달되면 매개 변수가 바뀝니다. 신호를 보면 currentIndexChanged(int)은 신호가 정수 매개 변수를 전달 함을 나타냅니다. funccurrentIndexChanged에서 오는 정수입니다. 나중에 func()을 수행합니다 (오류가 표시대로) func 매개 변수를 무시하지 않고 당신은 당신의 lambda에 "캐치"전달 된 매개 변수의 다른 매개 변수를 필요

을 분명히 정당하지 않은 정수 개체를 호출하려고 효과적으로 될 것입니다 :

cmd = lambda value, func=self.test: func(value) 

그런데 test 메서드는 매개 변수를 필요로하므로 func()을 사용할 수 없습니다.

clicked() 신호가 기본값을 대체하기위한 매개 변수를 전달하지 않기 때문에이 문제가 발생하지 않았습니다.

+0

대단히 감사합니다. 설명해 주셔서 감사합니다! –

+0

나에게서 플러스, 매개 변수가 덮어 쓴 것을 어떻게 알았습니까? 신호가 Qt에서 작동하는 방식으로 – user1767754

+0

@ user1767754. 슬롯은 같거나 적은 수의 인수를 가질 수 있으며 여분의 인수는 무시됩니다. 그러나 나머지 것들은 통과 될 것입니다. 이 인수에 대한 기본값이 있는지 여부는 중요하지 않습니다. 신호가 인수를 전달하면 가능한 경우 슬롯에 전달됩니다. – Avaris

3

참조 :

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 

from PyQt4 import QtCore, QtGui 

class myWindow(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(myWindow, self).__init__(parent) 

     self.comboBox = QtGui.QComboBox(self) 
     self.comboBox.addItems([str(x) for x in range(3)]) 
     self.comboBox.currentIndexChanged.connect(self.on_comboBox_currentIndexChanged) 

     slotLambda = lambda: self.on_comboBox_currentIndexChanged_lambda("some_value") 
     self.comboBox.currentIndexChanged.connect(slotLambda) 

    @QtCore.pyqtSlot(int) 
    def on_comboBox_currentIndexChanged(self, value): 
     print value 

    @QtCore.pyqtSlot(str) 
    def on_comboBox_currentIndexChanged_lambda(self, string): 
     print string 

if __name__ == "__main__": 
    import sys 

    app = QtGui.QApplication(sys.argv) 
    app.setApplicationName('myWindow') 

    main = myWindow() 
    main.show() 

    sys.exit(app.exec_()) 
+0

이봐, 고마워! 나는 아직이 일을 처리하지 못했지만, 오늘은 나중에 희망을 갖고 돌아 다닐 것이다! –