信号连接槽的方法有4种:
- 在创建 Widget 的时候使用信号作为关键字参数,其值为连接的槽函数名
- 使用信号的 connect() 方法连接到槽
- 使用 QWidget 的 pyqtConfigure() 方法配置
- 通过函数名称连接槽
下面这个例子演示了同一个信号使用不同的方法连接不同的槽的方法,也演示了如何通过 Widget 的 objectName 来找到它,还演示了如何使用 Widget 的 pyqtConfigure() 方法来配置它的属性。
signals_slots_demo.pyw
from PyQt5.QtWidgets import (QApplication, QWidget, QFontComboBox, QLabel,
QHBoxLayout, QPushButton, QMessageBox, QVBoxLayout)
from PyQt5.QtCore import QMetaObject
class MainWindow(QWidget):
def __init__(self):
super().__init__(None)
self.initUI()
def initUI(self):
main_layout = QHBoxLayout()
# 第一种信号与槽连接的方法
cb_font = QFontComboBox(currentFontChanged=self.changeLabelFont)
cb_font.pyqtConfigure(objectName='fontCombo', editable=False)
# 第二种信号与槽连接的方法
cb_font.currentFontChanged.connect(self.changeButtonFont)
main_layout.addWidget(cb_font)
label = QLabel()
label.pyqtConfigure(text='示例文本!', objectName='label')
main_layout.addWidget(label)
closeButton = QPushButton('关闭')
# 第三种连接信号与槽的方法
closeButton.pyqtConfigure(objectName='button', clicked=self.close)
main_layout.addWidget(closeButton)
vhbox = QVBoxLayout()
vhbox.addLayout(main_layout)
vhbox.addStretch(1)
self.setLayout(vhbox)
# 第四种连接信号与槽的方法
QMetaObject.connectSlotsByName(self)
def changeLabelFont(self, c_font):
label = self.findChild(QLabel, 'label')
label.setFont(c_font)
def changeButtonFont(self, c_font):
button = self.findChild(QPushButton, 'button')
button.setFont(c_font)
def on_fontCombo_currentFontChanged(self, c_font):
"""
通过 Widget 的 objectName 来连接槽,槽的名称如下所示:
on_