• [Repost]Events and Signals in PyQt4


    Reference:http://zetcode.com/gui/pyqt4/eventsandsignals/

    Events and Signals in PyQt4

    In this part of the PyQt4 programming tutorial, we will explore events and signals occurring in applications.

     

    Events

    All GUI applications are event-driven. Events are generated mainly by the user of an application. But they can be generated by other means as well: e.g. an Internet connection, a window manager, or a timer. When we call the application's exec_() method, the application enters the main loop. The main loop fetches events and sends them to the objects.

    In the event model, there are three participants:

    • event source
    • event object
    • event target

    The event source is the object whose state changes. It generates events. The event object (event) encapsulates the state changes in the event source. The event target is the object that wants to be notified. Event source object delegates the task of handling an event to the event target.

    PyQt4 has a unique signal and slot mechanism to deal with events. Signals and slots are used for communication between objects. A signal is emitted when a particular event occurs. A slot can be any Python callable. A slot is called when a signal connected to it is emitted.

    New API

    PyQt4.5 introduced a new style API for working with signals and slots.

    QtCore.QObject.connect(button, QtCore.SIGNAL('clicked()'), self.onClicked)
    

    This is the old style API.

    button.clicked.connect(self.onClicked)
    

    The new style adheres more to the Python standards.

    Signals & Slots

    This is a simple example demonstrating signals and slots in PyQt4.

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    """
    ZetCode PyQt4 tutorial 
    
    In this example, we connect a signal
    of a QtGui.QSlider to a slot 
    of a QtGui.QLCDNumber. 
    
    author: Jan Bodnar
    website: zetcode.com 
    last edited: October 2011
    """
    
    import sys
    from PyQt4 import QtGui, QtCore
    
    
    class Example(QtGui.QWidget):
        
        def __init__(self):
            super(Example, self).__init__()
            
            self.initUI()
            
        def initUI(self):
            
            lcd = QtGui.QLCDNumber(self)
            sld = QtGui.QSlider(QtCore.Qt.Horizontal, self)
    
            vbox = QtGui.QVBoxLayout()
            vbox.addWidget(lcd)
            vbox.addWidget(sld)
    
            self.setLayout(vbox)
            sld.valueChanged.connect(lcd.display)
            
            self.setGeometry(300, 300, 250, 150)
            self.setWindowTitle('Signal & slot')
            self.show()
            
    def main():
        
        app = QtGui.QApplication(sys.argv)
        ex = Example()
        sys.exit(app.exec_())
    
    
    if __name__ == '__main__':
        main()
    

    In our example, we display a QtGui.QLCDNumber and a QtGui.QSlider. We change the lcd number by dragging the slider knob.

    sld.valueChanged.connect(lcd.display)
    

    Here we connect a valueChanged signal of the slider to the display slot of the lcd number.

    The sender is an object that sends a signal. The receiver is the object that receives the signal. Theslot is the method that reacts to the signal.

    Signals & slotFigure: Signal & slot

    Reimplementing event handler

    Events in PyQt4 are processed often by reimplementing event handlers.

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    """
    ZetCode PyQt4 tutorial 
    
    In this example, we reimplement an 
    event handler. 
    
    author: Jan Bodnar
    website: zetcode.com 
    last edited: October 2011
    """
    
    import sys
    from PyQt4 import QtGui, QtCore
    
    
    class Example(QtGui.QWidget):
        
        def __init__(self):
            super(Example, self).__init__()
            
            self.initUI()
            
        def initUI(self):      
            
            self.setGeometry(300, 300, 250, 150)
            self.setWindowTitle('Event handler')
            self.show()
            
        def keyPressEvent(self, e):
            
            if e.key() == QtCore.Qt.Key_Escape:
                self.close()
            
    def main():
        
        app = QtGui.QApplication(sys.argv)
        ex = Example()
        sys.exit(app.exec_())
    
    
    if __name__ == '__main__':
        main()
    

    In our example, we reimplement the keyPressEvent() event handler.

    def keyPressEvent(self, e):
        
        if e.key() == QtCore.Qt.Key_Escape:
            self.close()
    

    If we click the Escape button, the application terminates.

    Event sender

    Sometimes it is convenient to know which widget is the sender of a signal. For this, PyQt4 has thesender() method.

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    """
    ZetCode PyQt4 tutorial 
    
    In this example, we determine the event sender
    object.
    
    author: Jan Bodnar
    website: zetcode.com 
    last edited: October 2011
    """
    
    import sys
    from PyQt4 import QtGui, QtCore
    
    
    class Example(QtGui.QMainWindow):
        
        def __init__(self):
            super(Example, self).__init__()
            
            self.initUI()
            
        def initUI(self):      
    
            btn1 = QtGui.QPushButton("Button 1", self)
            btn1.move(30, 50)
    
            btn2 = QtGui.QPushButton("Button 2", self)
            btn2.move(150, 50)
          
            btn1.clicked.connect(self.buttonClicked)            
            btn2.clicked.connect(self.buttonClicked)
            
            self.statusBar()
            
            self.setGeometry(300, 300, 290, 150)
            self.setWindowTitle('Event sender')
            self.show()
            
        def buttonClicked(self):
          
            sender = self.sender()
            self.statusBar().showMessage(sender.text() + ' was pressed')
            
    def main():
        
        app = QtGui.QApplication(sys.argv)
        ex = Example()
        sys.exit(app.exec_())
    
    
    if __name__ == '__main__':
        main()
    

    We have two buttons in our example. In the buttonClicked() method we determine which button we have clicked by calling the sender() method.

    btn1.clicked.connect(self.buttonClicked)            
    btn2.clicked.connect(self.buttonClicked)
    

    Both buttons are connected to the same slot.

    def buttonClicked(self):
      
        sender = self.sender()
        self.statusBar().showMessage(sender.text() + ' was pressed')
    

    We determine the signal source by calling the sender() method. In the statusbar of the application, we show the label of the button being pressed.

    Event senderFigure: Event sender

    Emitting signals

    Objects created from a QtCore.QObject can emit signals. In the following example we will see how we can emit custom signals.

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    """
    ZetCode PyQt4 tutorial 
    
    In this example, we show how to emit a
    signal. 
    
    author: Jan Bodnar
    website: zetcode.com 
    last edited: January 2015
    """
    
    import sys
    from PyQt4 import QtGui, QtCore
    
    
    class Communicate(QtCore.QObject):
        
        closeApp = QtCore.pyqtSignal() 
        
    
    class Example(QtGui.QMainWindow):
        
        def __init__(self):
            super(Example, self).__init__()
            
            self.initUI()
            
            
        def initUI(self):      
    
            self.c = Communicate()
            self.c.closeApp.connect(self.close)       
            
            self.setGeometry(300, 300, 290, 150)
            self.setWindowTitle('Emit signal')
            self.show()
            
            
        def mousePressEvent(self, event):
            
            self.c.closeApp.emit()
            
            
    def main():
        
        app = QtGui.QApplication(sys.argv)
        ex = Example()
        sys.exit(app.exec_())
    
    
    if __name__ == '__main__':
        main()
    

    We create a new signal called closeApp. This signal is emitted during a mouse press event. The signal is connected to the close() slot of the QtGui.QMainWindow.

    class Communicate(QtCore.QObject):
        
        closeApp = QtCore.pyqtSignal()     
    

    A signal is created with the QtCore.pyqtSignal() as a class attribute of the external Communicate class.

    self.c.closeApp.connect(self.close) 
    

    The custom closeApp signal is connected to the close() slot of the QtGui.QMainWindow.

    def mousePressEvent(self, event):
        
        self.c.closeApp.emit()
    

    When we click on the window with a mouse pointer, the closeApp signal is emitted. The application terminates.

    In this part of the PyQt4 tutorial, we have covered signals and slots.

    转载本Blog文章请注明出处,否则,本作者保留追究其法律责任的权利。 本人转载别人或者copy别人的博客内容的部分,会尽量附上原文出处,仅供学习交流之用,如有侵权,联系立删。
  • 相关阅读:
    上传文件插件-bootstrap-fileinput
    js【jquery】
    html
    CSS3中的vh、vw及其应用场景
    element,点击查看,实现tab切换:
    js 遍历tree的一个例子(全遍历),更复杂的功能
    js 遍历tree的一个例子(全遍历)
    js 遍历tree的一个例子
    您的连接不是私密连接
    Es6中Map对象和Set对象的介绍及应用
  • 原文地址:https://www.cnblogs.com/drfxiaoliuzi/p/5638982.html
Copyright © 2020-2023  润新知