PyQt5 笔记(05):信号/槽

 

PyQt 的很多类都内置了信号和槽。下图是 Qt 官方文档对 QThread 类中包含的信号/槽的描述:

 

 

 

一、信号/槽 都是内置的

请看一个最简单的程序: 按钮点击后,窗口关闭

               

代码:

class Test(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)

        btn = QPushButton('关闭', self)

        btn.clicked.connect(self.close) # ①

对语句①的说明:

      信号 ==> 槽
  信号(btn.clicked)、槽(self.close)都是内置
  作用:按钮点击后,窗口关闭

完整代码:

from PyQt5.QtWidgets import *
import sys

class Test(QDialog):
    def __init__(self,parent=None):
        super().__init__(parent)

        btn = QPushButton('关闭', self)

        btn.clicked.connect(self.close) 

if __name__ == '__main__':
    app = QApplication(sys.argv)
    dlg = Test()
    dlg.show()
    sys.exit(app.exec_())

View Code

 

 

二、信号内置、槽自定义

功能同上。

class Test(QDialog):
    def __init__(self,parent=None):
        super().__init__(parent)

        btn = QPushButton('关闭', self)

        btn.clicked.connect(self.my_close) # ①

    def my_close(self): # ② 自定义槽
        self.close()

对语句①的说明:

      信号 ==> 槽
  信号(btn.clicked)是内置的、槽(self.my_close)是自定义
  作用:按钮点击后,窗口关闭

 

完整代码:

from PyQt5.QtWidgets import *
import sys

class Test(QDialog):
    def __init__(self,parent=None):
        super().__init__(parent)

        btn = QPushButton('关闭', self)

        btn.clicked.connect(self.my_func) 

    def my_func(self):
        self.close()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    dlg = Test()
    dlg.show()
    sys.exit(app.exec_())

View Code

 

 

三、信号是自定义的,槽是内置的

class Test(QDialog):

    button_clicked_signal = pyqtSignal() # 自定义信号,不带参

    def __init__(self,parent=None):
        super().__init__(parent)

        btn = QPushButton('关闭', self)
        btn.clicked.connect(self.btn_clicked) # ① 信号/槽

        self.button_clicked_signal.connect(self.close) # ③接收信号,连接到槽

    def btn_clicked(self):
        self.button_clicked_signal.emit() # ②发送自定义信号,无参

对语句③的说明:

      信号 ==> 槽
  信号(button_clicked_signal)是自定义的、槽(self.close)是内置
  作用:按钮点击后,窗口关闭

 

附图说明一下执行顺序:

 

 

 

完整代码:

from PyQt5.QtWidgets import *
import sys

class Test(QDialog):

    button_clicked_signal = pyqtSignal() # 自定义信号,不带参

    def __init__(self,parent=None):
        super().__init__(parent)

        btn = QPushButton('关闭', self)
        btn.clicked.connect(self.btn_clicked) # 信号/槽

        self.button_clicked_signal.connect(self.close) # 接收信号,连接到槽

    def btn_clicked(self):
        self.button_clicked_signal.emit() # 发送自定义信号,无参

if __name__ == '__main__':
    app = QApplication(sys.argv)
    dlg = Test()
    dlg.show()
    sys.exit(app.exec_())

View Code

 

 

四、信号/槽 都是自定义的

class Test(QDialog):

    button_clicked_signal = pyqtSignal() # 自定义信号,不带参

    def __init__(self,parent=None):
        super().__init__(parent)

        btn = QPushButton('关闭', self)
        btn.clicked.connect(self.btn_clicked) # 信号/槽

        self.button_clicked_signal.connect(self.my_close) # 接收信号,连接到槽

    def btn_clicked(self):
        self.button_clicked_signal.emit() # 发送自定义信号,无参

    def my_close(self):
        self.close()

 

完整代码:

from PyQt5.QtWidgets import *
import sys

class Test(QDialog):

    button_clicked_signal = pyqtSignal() # 自定义信号,不带参

    def __init__(self,parent=None):
        super().__init__(parent)

        btn = QPushButton('关闭', self)
        btn.clicked.connect(self.btn_clicked) # 信号/槽

        self.button_clicked_signal.connect(self.my_close) # 接收信号,连接到槽

    def btn_clicked(self):
        self.button_clicked_signal.emit() # 发送自定义信号,无参

    def my_close(self):
        self.close()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    dlg = Test()
    dlg.show()
    sys.exit(app.exec_())
    

View Code

 

时间: 2024-08-01 11:30:08

PyQt5 笔记(05):信号/槽的相关文章

PyQt5 笔记(04):主窗口卡死问题

本文基于:windows 7 + python 3.4 知识点:  1. 将 time.sleep 替换为 QTimer  2. 将 time.sleep 放入到 QThread  3. 使用 QThread 自己的 sleep 方法   我们希望实现一个这样的小程序:                                         当点击开始按钮的时候,下面的文本标签每隔一秒自动加1.     一.直接用 time.sleep(1) import time class Test

PyQt5 笔记(03):弹出窗口大全

本文实现了PyQt5个各种弹出窗口:输入框.消息框.文件对话框.颜色对话框.字体对话框.自定义对话框 其中,为了实现自定义对话框的返回值,使用了信号/槽   本文基于 windows 7 + python 3.4   效果图:     取得弹出窗口的返回值     全部代码:   from PyQt5.QtWidgets import * from PyQt5.QtCore import Qt, pyqtSignal, QTimer class MyWindow(QWidget): def __

Qt学习之路(9):深入了解信号槽

槽函数和普通的C++成员函数没有很大的区别.它们也可以使virtual的:可以被重写:可以使public.protected或者 private的:可以由其它的C++函数调用:参数可以是任何类型的.如果要说区别,那就是,槽函数可以和一个信号相连接,当这个信号发生时,它可以被自动调用. connect()语句的原型类似于: connect(sender, SIGNAL(signal), receiver, SLOT(slot)); 这里,sender和receiver都是QObject类型的,si

Qt学习之路(4):初探信号槽

看过了简单的Hello, world! 之后,下面来看看Qt最引以为豪的信号槽机制! 所谓信号槽,简单来说,就像是插销一样:一个插头和一个插座.怎么说呢?当某种事件发生之后,比如,点击了一下鼠标,或者按了某个按键,这时,这个组件就会发出一个信号.就像是广播一样,如果有了事件,它就漫天发声.这时,如果有一个槽,正好对应上这个信号,那么,这个槽的函数就会执行,也就是回调.就像广播发出了,如果你感兴趣,那么你就会对这个广播有反应.干巴巴的解释很无力,还是看代码: #include <QtGui/QAp

no such signal-QT多线程信号槽没有响应

问题描述 QT多线程信号槽没有响应 程序逻辑很简单,就是让一个独立线程发送一个信号,UI线程的槽响应,但是运行报错居然是找不到信号 No such signal ,但是编译可以通过,moc文件也有这个信号.大侠们指点一下子,谢谢 #include "dialog.h" #include "ui_dialog.h" Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui-&g

多线程中的信号/槽

作者: 柴树杉[翻译] (chaishushan@gmail.com) 日期: 2008-01-05 于武汉 注解: 该文档根据Threading, Signals/Slots翻译,依照创作公用约定发布. 开始 在许多应用中都会遇到非常耗时的运算,在进行该类型运算时常常会影响程序正常的消息处理. 为了处理上述问题,我们可以将耗时的运算从GUI线程中移出来,单独放到一个work线程中. 这样的话,GUI则可以保持时刻响应. 下面的例子中,我们将演示如何运用多线程.在一个work线程中将完成绘制五角

QGraphicsItem如何使用信号/槽

简述 对于 QGraphicsItem 来说,信号/槽和属性机制不是它的一部分,因为它不继承自 QObject.这是一个出于性能考虑的设计决策,允许比较大的场景以及快速的交互. 特殊情况下,如果真的需要使用信号/槽,可以使用 QObject 的信号/槽和属性机制来扩展 QGraphicsItem. 简述 继承自 QObject 和 QGraphicsItem 继承自 QGraphicsObject 性能差异 继承自 QObject 和 QGraphicsItem 这种方式属于多继承,也是最容易想

信号槽库:sigslot.h和sigc++使用

用qt的知道,qt有方便简单的信号槽机制,但需要专门的qt工具处理. 如果想直接使信号槽就可以使用sigslot库,或者sigc++库,或者boost中的signals,这里介绍sigslot和sigc++库. sigslot.h:只有一个头文件,使用简单方便. sigc++:包含文件多,但功能更强大. sigslot库 官方地址 http://sigslot.sourceforge.net/ 在vs2013中使用 包含头文件 #include "sigslot.h" 1 1 改动:

PyQt5 笔记(02):嵌套布局

如前一篇笔记,我们还是只讨论两层嵌套布局的情况. 前面的布局有一个缺点:有三个内层布局,则需要三个空部件.那若有十个内层布局呢?显然会让人不舒服. 刚才在玩 Qt Designer 时,发现了一个更好的办法,不管有多少个内层布局,只需要一个空部件.   一.过程分析: 1. 先准备一个全局部件,用于"承载"全局布局 # 全局部件(注意参数 self),用于"承载"全局布局 wwg = QWidget(self)   2. 再定义全局布局 wl = QVBoxLayo