• 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

  • 相关阅读:
    linux多线程学习笔记五--线程安全【转】
    linux多线程学习笔记六--一次性初始化和线程私有数据【转】
    【Linux】可重入函数和线程安全的区别与联系【转】
    【Linux】自主实现my_sleep【转】
    Linux/Unix编程中的线程安全问题【转】
    C语言字符串操作总结大全(超详细)【转】
    linux中的strip命令简介------给文件脱衣服【转】
    FTK应用程序编程接口(API)手册-1【转】
    python编程(python开发的三种运行模式)【转】
    ftk学习记(label篇)【转】
  • 原文地址:https://www.cnblogs.com/hushaojun/p/4435557.html
Copyright © 2020-2023  润新知