4. 信号与槽

专栏地址 ʅ(‾◡◝)ʃ


1.什么是信号和槽

信号:
举几个例子,当你点击一个按钮时会发射一个点击 clicked 的信号, 或者你在输入框中 输入一些文字时, 输入框会发射 内容改变的 信号
信号的发起者可能是人也可能是程序
前俩个例子都是人发起的信号, 对程序的一些操作, 也有是程序发射信号的, 比如定时器发射超时信号

槽函数:
当一个程序你点击后没有 “反应” 是不行的, 那么我们来捕获这个 “反应” 用到的函数就是槽函数, 或者说槽函数是接受信号后的一个反馈

举一个完整的映射关系来理解信号和槽函数:
当你点击一个按钮时, 按钮发射一个 clicked 信号, 针对这个信号你建立一个 response() 函数, 你在这个函数里面做了一些工作,比如输出一句话.
所以这个程序就实现了 你点击一下按钮就能输出一句话 的效果

2.如何建立信号和槽函数

添加信号槽关系可以通过两种方式:

通过 qtdesigner添加

qtdesigner 打开上一节设计的窗体
编辑-编辑信号/槽 点击
然后悬浮在按钮上会显示红色的框框,说明进入了 编辑信号/槽 模式 (或者按F4快捷键)
点击住按钮然后拖拽会弹出一个窗体
在这里插入图片描述
在这里面可以编辑 按钮点击发射的信号 和接受这个信号所用的槽函数, 槽函数里面什么也没有, 这时我们点击右边的编辑按钮可以进入编辑自定义槽函数名称
在这里插入图片描述
这里我点击 + 号添加了一个自定义的槽函数 test() (注意要有括号)
然后 ok
在这里插入图片描述
选中建立好的 槽函数 和 clicked 信号, 选中 ok
这样一个 信号-槽函数 关系就建立好了
建立好后,我们保存窗体,ctrl + s 然后将 .ui 窗体转换为 .py 文件,这个时候我们执行 main.py 文件会报错

AttributeError: 'MyWin' object has no attribute 'test'

翻译一下: Mywin 这个对象没有 test 属性
因为我们只设置了按钮点击发射 clicked 信号 对应 test() 槽函数, 而我们却没有定义 test() 槽函数
所以我们要 修改业务逻辑代码:
4.1

from form import Ui_Form
from PyQt5.QtWidgets import *
import sys


class MyWin(QWidget,Ui_Form):
    """docstring for Mywine"""
    def __init__(self):
        super(MyWin, self).__init__()
        self.setupUi(self)

    def test(self): # 这里test就是槽函数, 当点击按钮时执行 test 函数中的内容, 注意有一个参数为 self
        print('hello world!')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mywin = MyWin() # 实例化一个窗口小部件
    mywin.setWindowTitle('Hello world!') # 设置窗口标题
    mywin.show() #显示窗口
    sys.exit(app.exec())

下面我们执行代码 点击按钮 输出 hello world!
在这里插入图片描述
上面我说的是第一种方法建立 信号-槽函数 的对应关系,我推荐这种, 其实你也可以在代码中自己添加, 只不过在 qtdesigner 中修改比较方便
为了方便大家理解我简单说一下, 在代码中一个怎么添加 信号-槽函数 这种对应关系

通过修改业务逻辑代码添加

4.2

from form import Ui_Form
from PyQt5.QtWidgets import *
import sys


class MyWin(QWidget,Ui_Form):
    """docstring for Mywine"""
    def __init__(self):
        super(MyWin, self).__init__()
        self.setupUi(self)
        self.pushButton.clicked.connect(self.test) # 在代码中添加信号槽函数对应关系
    def test(self): # 这里test就是槽函数, 当点击按钮时执行 test 函数中的内容, 注意有一个参数为 self
        print('hello world!')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mywin = MyWin() # 实例化一个窗口小部件
    mywin.setWindowTitle('Hello world!') # 设置窗口标题
    mywin.show() #显示窗口
    sys.exit(app.exec())

其实你要是细心会发现在 生成的图形和界面代码中 form.py

self.pushButton.clicked.connect(Form.test)

也就是这一句设置了对应映射关系, 有人可能会疑问为什么这里是 Form.test, 而不是 self.test
其实是在你新建的 MyWin 类中 self.setupUi(self) 把 self 传进去了

posted @ 2019-03-16 15:17  Hello_wshuo  阅读(41)  评论(0编辑  收藏  举报