(十)信号与槽
(1) 说明
信号和槽是Qt的核心内容
1.信号(signal)
其实就是事件(按钮点击,内容发生改变,窗口的关闭事件)或者是状态(check选中了, togglebutton切换)
当程序触发了某种状态或者发生了某种事件(比如:按钮点击了,内容改变等等),那么即可发射出来一个信号
2.槽(slot)
若想捕获这个信号,然后执行相应的逻辑代码,那么就需要使用到槽,槽实际上是一个函数,当信号发射出来后,会执行与之绑定的槽函数
3.将信号与槽链接
为了能够实现,当点击某个按钮时执行某个逻辑,需要把具体的信号和具体的槽函数绑定在一起
操作大体流程如下
对象.信号.connect(槽函数)
(2) 案例1:接收信号
(3) 案例2:自定义信号
除了接收Qt自带的信号之外,我们也可以自行定义信号,在合适的时机,自行 发射信号
自定义信号需要使用pyqtSignal来声明信号,并且需要在类中的函数之外声明
1.主程序
1.创建对象;
2.对象要死循环运行,监测事件,要更新界面
3.MyWindon继承了QWidget;
4.窗口要显示
2.窗口类
super().__init__() 调用父类
self.init_ui() 调用自己的初始化
这里要注意的几点:
1.声明自定义信号的时候,必须在类中定义,而不能在函数中定义
2.btn = QPushButton("开始检测", self)被触发后,才会调用check函数
3.关键的是self.my_signal.connect(self.my_slot)这里是怎么触发的
这里先看一下def check(self):函数
先解释一下enumerate( )函数
enumerate( ) 用来遍历列表里元素的下标和元素
"192.168.1.%d" % x for x in range(1, 255)
ip就是从192.168.1.1到192.168.1.254之间挨个取值
而 i 就是列表的下标,取值范围从0-253
---------现在可以解释上述self.my_signal.connect(self.my_slot)触发问题-------------------
self.my_signal.emit(msg + "[发现漏洞]") # 相当于调用了my_slot函数
1.创建信号
2.绑定槽函数
3.在合适的位置发信号
4.槽函数执行
程序运行结果如下