信號連接槽的方法有4種:
- 在創(chuàng)建 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_<object name>_<signal name>(<signal parameters>)
在我們的這個例子中, object name 是 fontCombo; signal name 是 currentFontChanged; 信號的參數是 c_font, 表示選擇的字體
"""
QMessageBox.information(self, '提示信息', '選擇的字體名稱是: <b>%s</b>' % c_font.family())
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
w = MainWindow()
w.resize(500, 400)
w.show()
sys.exit(app.exec_())

signals_slots_demo.gif