2013-01-05 23 views
5

Aşağıdaki sorunla karşılaşıyorum. Sonrasında bazı ekstra verileri iletmek için bir Lambda işlevini bir Sinyala bağlamaya çalışıyorum. Ben createTimeComboBox(), çalıştırdığınızdaPyQT Lambda işlevinin Sinyal'e bağlanması

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 

bu hatayı alıyorum:

TypeError: 'int' object is not callable 

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

çalışıyor

için

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

değiştirilmesi, ama muktedir istiyorumgeçmekdeğişken de, yani lambda yaklaşımını kullanmam gerektiğini varsaydım.

Bunu daha önce QPushButton'un clicked() sinyaliyle yapmıştım ve bu iyi çalıştı.

Umarım bu mantıklıdır - herhangi bir fikri olan var mı? Önerileriniz için teşekkürler! Alkış Dave bu sizin için çalışıyorsa

cevap

5

Sizin lambda: Burada

timeComboBox.currentIndexChanged.connect(self.test) 

ile ve lambdas olmadan yeni stil sinyaller/yuvaları bağlantıyı gösteren, küçük bir çalışma örneği Bir parametre kabul eder ( func):

lambda func=self.test:func() 

Parametrenin bir varsayılan değeri olsa da, bir parametre iletilirse değiştirilir. Sinyale bakarak, currentIndexChanged(int), sinyalin bir tamsayı parametresini geçeceğini gösterir. func, currentIndexChanged'dan gelen tam sayı olacaktır. Daha sonra func() yapıyor (hata gösterir gibi) func parametresini geçersiz kılma olmadan Sen lambda "yakalamak" geçti parametrede başka bir parametre ihtiyaç

besbelli yasal olmayan bir tamsayı nesneyi aramaya çalışıyorum etkili bir olacaktır:

Bu arada, test yönteminiz bir parametre beklemektedir, böylece func() yapamazsınız.

clicked() sinyalinde bu sorunla karşılaşmadınız çünkü varsayılan değeri değiştirmek için bir parametre iletmiyor.

+0

Awesome teşekkür ederim, bu bir tedavi çalıştı! Bunu açıkladığın için teşekkürler! –

+0

Ayrıca benden, Parametrenin üzerine yazıldığını nasıl bildiniz? – user1767754

+0

@ user1767754 bu yolla Qt. Yuvalar aynı veya daha az argümana sahip olabilir ve ekstralar göz ardı edilir. Ama kalanlar geçecek. Bu argüman için bir varsayılanınız olup olmadığı önemli değildir. Bir sinyal bir argümanı geçerse, eğer yapabilirse slot alacaksınız. – Avaris

3

bakınız:

#!/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

Hey, bunun için teşekkürler! Henüz bunun üzerinden geçmeyi başaramadım, ama umarım bugün de umarız! –