莱芜网站建设价格,阿里巴巴网站网络营销的平台,什么网站做啤酒,软件系统开发合同信号与槽 前言信号与槽单对单直接连接使用lambda表达式 信号与槽多对多一个信号连接多个槽多个信号连接一个槽信号与信号连接 自定义信号 前言
PyQt5的信号与槽是一种对象之间的通信机制#xff0c;允许一个QObject对象发出信号#xff0c;与之相连接的槽函数将会自动执行。… 信号与槽 前言信号与槽单对单直接连接使用lambda表达式 信号与槽多对多一个信号连接多个槽多个信号连接一个槽信号与信号连接 自定义信号 前言
PyQt5的信号与槽是一种对象之间的通信机制允许一个QObject对象发出信号与之相连接的槽函数将会自动执行。信号与槽有以下几个特点
信号可以携带任意个、任意类型的参数。一个信号可以连接多个槽即一个槽可以监听多个信号。信号与槽的连接方式可以是同步连接也可以是异步连接。信号与槽可能会在不同的线程间连接这时信号连接只能是异步方式。信号不是必须有槽和其连接即信号可以不处理。信号个槽的连接可以被断开。
PyQt5使用pyqtSignal函数为QObject对象创建信号并把信号定义为类的属性。使用connect()函数可以将信号绑定到槽函数上使用disconnect()函数可以接触信号和槽之间的绑定。
信号与槽单对单
直接连接
import sys
from PyQt5.QtWidgets import *class Window(QWidget):def __init__(self):super(Window, self).__init__()self.btn QPushButton(Start, self)self.btn.clicked.connect(self.change_text)def change_text(self):if self.btn.text() Start:self.btn.setText(Stop)else:self.btn.setText(Start)if __name__ __main__:app QApplication([])window Window()window.show()sys.exit(app.exec())
在上述代码中创建一个QPushButton对象self.btn并将其文本设置为Start。这个按钮被添加到当前窗口中由self表示。
self.btn.clicked.connect(self.change_text): 当按钮被点击时将调用change_text方法。在change_text的方法中根据当前按钮显示的文字改变为另一个文字。
这个简单的程序创建了一个窗口其中包含一个可以切换其标签的按钮“Start和Stop”。每次点击按钮时都会调用change_text方法来更改其标签。
运行结果如下运行时按钮上的文字是Start按下之后会变成Stop
使用lambda表达式
import sys
from PyQt5.QtWidgets import *class Window(QWidget):def __init__(self):super().__init__()btn QPushButton(Start, self)btn.clicked.connect(lambda:btn.setText(Stop))if __name__ __main__:app QApplication([])win Window()win.show()sys.exit(app.exec())
在上述代码中我们并没有创建新的槽函数只采用lambda表达式来设置按钮的值。不过与上一个方法相比这个代码只能将Start变成Stop但是不能变回Start
运行结果与上种方式相同
信号与槽多对多
一个信号连接多个槽
import sys
from PyQt5.QtWidgets import *class Window(QWidget):def __init__(self):super(Window, self).__init__()self.btn QPushButton(Start, self)self.btn.clicked.connect(self.change_text)self.btn.clicked.connect(self.change_size)def change_text(self):if self.btn.text() Start:self.btn.setText(Stop)else:self.btn.setText(Start)def change_size(self):self.btn.resize(150, 30)if __name__ __main__:app QApplication([])win Window()win.show()sys.exit(app.exec())
在代码中按钮除了连接到了改变按钮文字的槽函数之外还连接到了更换按钮大小的槽函数所以在按下按钮后除了改变了文字还改变了按钮大小。
运行结果如下
多个信号连接一个槽
import sys
from PyQt5.QtWidgets import *class Window(QWidget):def __init__(self):super(Window, self).__init__()self.btn QPushButton(Start, self)self.btn.pressed.connect(self.change_text)self.btn.released.connect(self.change_text)def change_text(self):if self.btn.text() Start:self.btn.setText(Stop)else:self.btn.setText(Start)if __name__ __main__:app QApplication([])win Window()win.show()sys.exit(app.exec())
在上述代码中
当按钮被按下时会触发 pressed 信号连接 pressed 信号到 self.change_text 函数每次按钮被按下时self.change_text 函数都会被调用。
当按钮被释放时会触发 released 信号连接 released 信号到 self.change_text 函数每次按钮被释放时self.change_text 函数都会被调用。
所以self.change_text 函数会在按钮被按下和释放时都被调用。
信号与信号连接
import sys
from PyQt5.QtWidgets import *class Window(QWidget):def __init__(self):super(Window, self).__init__()self.btn QPushButton(Start, self)self.btn.pressed.connect(self.btn.released)self.btn.released.connect(self.change_text)def change_text(self):if self.btn.text() Start:self.btn.setText(Stop)else:self.btn.setText(Start)if __name__ __main__:app QApplication([])win Window()win.show()sys.exit(app.exec())
在上述代码中将pressed连接到released而released连接到了change_text。运行效果和上面代码一致
自定义信号
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *class Window(QWidget):my_signal pyqtSignal(int, int)def __init__(self):super().__init__()self.my_signal.connect(self.my_slot)def my_slot(self, x, y):print(x)print(y)def mousePressEvent(self, event):x event.pos().x()y event.pos().y()self.my_signal.emit(x, y)if __name__ __main__:app QApplication([])win Window()win.show()sys.exit(app.exec())
在PyQt5中mousePressEvent是鼠标按下时会触发的信号我们自己定义的信号self.my_signal与槽函数my_slot相连接当鼠标按下时self.my_signal使用emit触发self.my_signal信号。效果就是点击窗口会输出当前鼠标位置。