[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.

Figure: 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.

Figure: 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.

时间: 2024-10-08 20:04:23

[Repost]Events and Signals in PyQt4的相关文章

PyQt4入门

PyQt4入门教程(6)_对话框 文中译者的话将用方括号[]标出.对话框(Dialogs)是现代GUI程序中不可缺少的一部分.对话本来指的是两个或者更多人之间的交流,而在计算机应用中,对话是一个可以让我们和应用"说话"的窗口.对话框可以用来输入数据.修改数据.更改应用设置等等.QtGui.QInputDialog类QtGui.QInputDialog类提供了一个简单便捷的对话框来从用户处得到一个单值.用户的输入可以是字符串.数字,也... 2016-03-08 00:00 阅读(888

和Keyle一起学StrangeIoc – Extensions

Strange: the IoC framework for Unity Extensions You may have heard that Strange is a Dependency Injection framework. I'm a little uncomfortable with that description. Sure, Strange offers DI and it's a great use, but the core of the framework - as I'

Reactor Pattern and Non-blocking IO--reference

reference from:http://www.cs.bgu.ac.il/~spl051/Personal_material/Practical_sessions/Ps_12/ps12.html Java server class with multiple client connections: one-to-one ratio of threads to clients, therefore enormous thread overhead, resulted in performanc

ZetCode PyQt4 tutorial signals and slots

#!/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 ""&quo

Threads Events QObjects

Events and the event loop Being an event-driven toolkit, events and event delivery play a central role in Qt architecture. In this article we'll not give a comprehensive coverage about this topic; we'll instead focus on some thread-related key concep

PyQt4(3)

事件 所有GUI应用程序都是事件-驱动模式. 在事件模型中,有三个参与者: 事件源 事件对象 事件目标 事件源是对象状态的变化,它引发事件.事件对象则封装了事件源中的状态的变化.事件目标是事件想要通知的目标. PyQt4中具有独特的信号和槽机制来处理事件,信号和时隙(slots)用于对象之间的通信.当一个特定的事件发生时,信号将被发射.时隙能被Python调用,当连接到它的信号被发射时被调用. 用于信号和间隙工作的新API QtCore.QObject.connect(button,QtCore

PyQt4信号与槽

事件 事件(Events)是GUI程序中很重要的一部分.它由用户或系统产生.当我们调用程序的exec_()方法时,程序就会进入主循环中.主循环捕获事件并将它们发送给相应的对象进行处理.奇趣公司(Trolltech)引入了信号和槽机制. 信号与槽 当用户单击一个按钮,拖动一个滑块或进行其它动作时,相应的信号就会发射.除此之外,信号还可以因为环境的变化而被发射.比如一个运动的始终将会发射事件信号等.而所谓的槽则是一个方法,该方法将会响应它所连接的信号.在Python中,槽可以是任何可以被调用的对象.

PYQT4.13

# -*- coding: cp936 -*- # -*- coding: cp936 -*-import sysfrom PyQt4 import QtCore, QtGui #导入模块app = QtGui.QApplication(sys.argv) #创建一个application对象 Python脚本可以通过shell运行,这样我们就可以对程序的启动进行控制.window = QtGui.QWidget() #QWidget是PyQt4中所有用户接口对象的基类 创建窗口window.r

ZetCode PyQt4 tutorial widgets I

#!/usr/bin/python # -*- coding: utf-8 -*- """ ZetCode PyQt4 tutorial In this example, a QtGui.QCheckBox widget is used to toggle the title of a window. author: Jan Bodnar website: zetcode.com last edited: September 2011 """ i