2012-12-09 18 views
5

olmadan olayı nasıl işleneceğini, usecase tarif edilebilir sık sık QLabel'den miras alınan yeni bir sınıf oluşturduğumuz şekilde gider. Ama sadece Yani bütün bir sınıf yazmak gerekmez sadecePyQT:</p> <p>Ben QLabel nesne <code>MouseMoveEvent</code>, eğitimde yol handel izin istiyorum varsayalım: şöyle bir miras olmadan fare olayı işleyebilir nasıl miras

ql = QLabel() 
ql.mouseMoveEvent = lambda e : print e.x(), e.y() 

gibi miras olmadan olayı handel lambda ifade kullanmak ve sadece bazı basit olay uygulamak için basit lambda ifade kullanabilirsiniz.

cevap

13

Bunu yapmanın en esnek yolu nesnenin adına olayları alabilmesi konusunda bir event filter yüklemektir:

from PyQt4 import QtGui, QtCore 

class Window(QtGui.QWidget): 
    def __init__(self): 
     QtGui.QWidget.__init__(self) 
     self.label = QtGui.QLabel(self) 
     self.label.setText('Hello World') 
     self.label.setAlignment(QtCore.Qt.AlignCenter) 
     self.label.setFrameStyle(QtGui.QFrame.Box | QtGui.QFrame.Plain) 
     self.label.setMouseTracking(True) 
     self.label.installEventFilter(self) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.label) 

    def eventFilter(self, source, event): 
     if (event.type() == QtCore.QEvent.MouseMove and 
      source is self.label): 
      pos = event.pos() 
      print('mouse move: (%d, %d)' % (pos.x(), pos.y())) 
     return QtGui.QWidget.eventFilter(self, source, event) 

if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.show() 
    window.resize(200, 100) 
    sys.exit(app.exec_()) 
+0

özellikle 'installEventFilter (self)' – swdev

3

Evet, bunu yapabilirsin, ama python2'de lambdada print kullanamazsın, bir deyim ve bir işlev değil, bir değer döndürmez.

bu deneyin:

ql = QLabel() 
def event_handler(e): 
    print e.x(), e.y() 
ql.mouseMoveEvent = event_handler 
+0

'print' python3 bir fonksiyonudur '__future__ import print_function' –

+0

@ X.Jacobs - elbette, ama onun print-sözdiziminden python2 kullandığını düşündüm. tabii ki gelecekteki bir ithalat da python2.6 + için bir çözümdür. – mata