信号槽是qt核心机制,也是Pyqt编程中对象之间进行通信的机制。信号与槽机制示意图如下所示:
信号(Signal)就是在特定情况下被发射的事件。
槽(Slot)就是对信号响应的函数。
当事件或状态发生改变时,就会发出信号。同时,这个信号会触发所有与这个事件(信号)相关的函数(槽)。信号和槽可以是多对多关系。一个信号可以连接多个槽,一个槽也可以监听多个信号。
下面演示两个函数
# 演示单击按钮时关闭窗口,使用自定义的信号与槽函数
from PyQt5.QtWidgets import *
from PyQt5.QtCore import pyqtSignal
import sys
class Winform(QWidget):
#自定义信号,不带参数
button_clicked_signal=pyqtSignal()
def __init__(self,parent=None):
super().__init__(parent)
self.setWindowTitle('自定义信号与槽函数示例')
self.resize(400,100)
btn = QPushButton('关闭',self)
#连接信号与槽函数
btn.clicked.connect(self.btn_clicked)
#接收信号,连接到自定义的槽函数
self.button_clicked_signal.connect(self.btn_close)
def btn_clicked(self):
# 发送自定义信号,无参数
self.button_clicked_signal.emit()
def btn_close(self):
self.close()
if __name__=="__main__":
app = QApplication(sys.argv)
win = Winform()
win.show()
sys.exit(app.exec_())
先把信号绑定到槽函数上,然后接收信号,连接到自定义的槽函数。通过点击按钮触发自定义的信号(button_clicked_signal),绑定自定义的槽函数(self.btn_close)。运行如图:
拖动滑块改变颜色
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class Example(QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
hbox = QHBoxLayout( )
self.l1 = QLabel("拖动滑块改变颜色")
self.l1.setFont(QFont("SanSerif",16))
hbox.addWidget(self.l1)
self.s1 = QScrollBar() #滑块条
self.s1.setMaximum(255) #最大值为255,因为这是RGB分量的最大值,默认为0
self.s1.sliderMoved.connect(self.sliderval) #把移动滑块条信号绑定自定义槽函数
self.s2 = QScrollBar()
self.s2.setMaximum(255)
self.s2.sliderMoved.connect(self.sliderval)
self.s3 = QScrollBar()
self.s3.setMaximum(255)
self.s3.sliderMoved.connect(self.sliderval)
hbox.addWidget(self.s1)
hbox.addWidget(self.s2)
hbox.addWidget(self.s3)
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('字体例子')
self.setLayout( hbox )
def sliderval(self):
print(self.s1.value(), self.s2.value(), self.s3.value() )
palette = QPalette()
c = QColor(self.s1.value(), self.s2.value(), self.s3.value(),255)
palette.setColor(QPalette.Foreground,c)
self.l1.setPalette(palette)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Example()
demo.show()
sys.exit(app.exec_())
运行示例如图所示:
另外推荐新手可以使用github开源的《PyQt5快速开发与实战》的代码。