IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Python GUI界面编程初步 05- GUI框架PyQt的运用 - 02 PyQt的信号和槽例子 -> 正文阅读

[C++知识库]Python GUI界面编程初步 05- GUI框架PyQt的运用 - 02 PyQt的信号和槽例子

前言:本节讨论PyQt的事件event和信号signal的应用:

事件和信号是GUI和应用交互的两个重要的概念。

其中,事件用来驱动,信号和槽用来动态链接,这两个东西合并起来适用于各种组合的GUI的触发场景


1 EVENTS事件

GUI的应用里面,Events事件驱动是基本的模式。当调用exec_() 方法来执行main loop 的时候。

main loop 便通过各种事件的发送和何侦听在各个事件模块上进行互换。

在event 原型里面,有3个要素:

  • event source #事件源
  • event object # 事件对象本身EVENT,事件对象封装了状态变更,在一个事件的变更源里面
  • event target #事件目标对象,就是事件要通知对象。

PyQt5 通过信号和槽的方式来处理events。 信号和槽用来在不同的对象中进行交互。当一个特定的Event发生的时候,信号被触发,而槽理解为EVENTs触发后,要进行的操作。信号和槽的连接就是信号进行传递的过程。

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtCore import Qt

class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('PyQt events with keyboard') 
        self.show()

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

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

上面代码给出了一个的事件的处理,这里KEY处理事件里面,我们改写了Esc键的事件的handler。让他变成了使得应用退出的功能。


2?Signals & slots信号和槽

来个例子;

拖动滚动条,将给出EVENT,这样lab的数字进行相应的改变。

import sys

from PyQt5.QtWidgets import (QApplication, QWidget, QSlider, QLCDNumber, QVBoxLayout)
from PyQt5.QtCore import Qt

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
       lcd = QLCDNumber(self)
       sld = QSlider(Qt.Horizontal, self)
       vbox = QVBoxLayout()
       vbox.addWidget(lcd)
       vbox.addWidget(sld)
       self.setLayout(vbox)
       sld.valueChanged.connect(lcd.display) #信号和槽的注册
       self.setGeometry(250, 250, 250, 150)
       self.setWindowTitle('Events demo') 
       self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

上例,

sld.valueChanged.connect(lcd.display)

这段代码,把QT的滚动条的值改变这个信号和连接的display这个槽,

signal = valuechanged

slots = display

在这里滑动条就是信号的发出者,而LCD显示块就是信号的接受者。槽理解为信号的一个回调的方法,或者说是回调函数。参数的传递就是从信号的所有者连接到接受的处理上,一旦绑定就是通过转换器自动处理。


3 EVENT,信号和槽的综合应用;

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton

class Example(QMainWindow):

    def __init__(self):
         super().__init__()
         self.initUI()

    def initUI(self):
        btn1 = QPushButton('One', self)
        btn1.move(30, 50)
        btn2 = QPushButton('Two', self)
        btn2.move(150, 50)
        btn1.clicked.connect(self.buttonClicked)
        btn2.clicked.connect(self.buttonClicked)
        self.statusBar()
        self.setGeometry(300, 300, 300, 150)
        self.setWindowTitle('Window') 
        self.show()

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

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

这个例子,我们把两个按键clicked的信号连接到了windows的按键的槽里面。实现了两个EVENT链接到一个EVENT处理。

我们首先用信号和槽机制,把鼠标的按键和窗口的按键响应链接起来:

btn1.clicked.connect(self.buttonClicked)

btn2.clicked.connect(self.buttonClicked)

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

然后,在事件处理程序里面,通过直接的调用传递,将不同的驱动的源又在状态栏分别区分显示出来。


4 定制一个发射的信号

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import pyqtSignal, QObject

class Communicate(QObject):
    closeApp = pyqtSignal()

class Example(QMainWindow):

    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.c = Communicate()
        self.c.closeApp.connect(self.close)
        self.setGeometry(300, 300, 300, 150)
        self.setWindowTitle('Mouse events') 
        self.show()

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

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

在这个例子里面:

先做了一个信号对象:通Qobject的继承关系,而pyqtSignal是Qobject本身就的方法。

class Communicate(QObject):

?closeApp = pyqtSignal()

然后,我们把这个信号EVENT连接到关闭窗口的槽上面

self.c = Communicate()

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

然后,这个信号的发射emit(),我们放在鼠标的按键的事件里面。

这样,当鼠标按下后,访问鼠标的mousePressEvent。然后,在事件处理里面,发出signal,给到接受的槽:self.close,然后,关闭窗口。

在这个应用,按下鼠标将关闭窗口。


PyQt events | Learn Python PyQt

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-10 11:31:37  更:2021-07-10 11:31:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 0:45:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码