2012-12-09 39 views
5

बिना घटना को संभालने के लिए मैं एक विरासत के बिना माउस घटना संभाल कर सकते हैं कैसे, इस प्रकार USECASE वर्णित किया जा सकता अक्सर इस तरह से चला जाता है कि हम QLabel से विरासत में मिली एक नई कक्षा बनाते हैं। लेकिन मैं सिर्फ विरासत के बिना घटना handel करने के लिए एक लैम्ब्डा अभिव्यक्ति का उपयोग कर सकते हैं बसPyQt:</p> <p>मान लीजिए कि मैं QLabel वस्तु <code>MouseMoveEvent</code>, ट्यूटोरियल में जिस तरह से handel करने के लिए करते हैं चाहता हूँ: कैसे विरासत

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

चाहते तो मैं एक पूरा वर्ग लिखने की जरूरत नहीं है और केवल साधारण लैम्ब्डा अभिव्यक्ति का उपयोग कुछ सरल घटना को लागू करने।

उत्तर

13

यह करने के लिए सबसे सुविधाजनक ढंग से एक event filter स्थापित करने के लिए उस वस्तु की ओर से की घटनाओं प्राप्त कर सकते हैं:

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

विशेष रूप से 'installEventFilter (स्वयं) ' – swdev

3

हाँ आप यह कर सकते हैं, लेकिन पायथन 2 में आप अपने लैम्ब्डा में print का उपयोग नहीं कर सकते, क्योंकि यह एक कथन है और कोई फ़ंक्शन नहीं है और कोई मान नहीं देता है।

इस प्रयास करें:

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

'print' python3 में एक समारोह है '__future__ आयात से प्रिंट_फंक्शन ' –

+0

@ एक्स। जैकब्स - निश्चित रूप से, लेकिन उनके प्रिंट-सिंटैक्स से मुझे लगा कि वह पायथन 2 का उपयोग कर रहा है। निश्चित रूप से भविष्य का आयात python2.6 + के लिए भी एक समाधान है। – mata