12. 为组件的内建信号编写槽函数
//自动关联槽函数
1. 清空
- 选中清空按钮右键 -> Go to slot -> clicked()
# QpushButton类的按钮常用的信号是clicked,就是点击发射信号
- 复制函数名称在myDialog.py文件的QmyDialog类下定义同名函数
def on_btnClear_clicked(self): self.ui.textEdit.clear()
2. 字体
- 选中Bold复选框右键 -> Go to slot -> toggled(bool)
# 复选框的状态变化时发射,toggled(bool)
- 复制函数名称在myDialog.py文件的QmyDialog类下定义同名函数
def on_chkBoxBold_toggled(self, checked): font = self.ui.textEdit.font() font.setBold(checked) # 参数checked表示勾选状态 self.ui.textEdit.setFont(font)
3. 下划线
- 选中Underline复选框右键 -> Go to slot -> clicked()
- 复制函数名称在myDialog.py文件的QmyDialog类下定义同名函数
def on_chkBoxUnder_clicked(self): checked = self.ui.chkBoxUnder.isChecked() # 读取勾选状态 font = self.ui.textEdit.font() font.setUnderline(checked) self.ui.textEdit.setFont(font)
4. 信号与槽关联的实现
- ui_DIalog.py 文件中setUi()函数最后一句:QtCore.QMetaObject.connectSlotsByName(Dialog)
- 使用了Qt的元对象(QMetaObject),它会搜索窗体上的所有组件,将信号与槽关联
- 槽函数命名规则
# on_<object name>_<signal name>(<signal parameters>)
* 组件的go to slot 生成的槽函数名称符合命名规范
5. 槽函数框架生成
- UI窗体文件必须在一个GUI项目里打开,一个.ui文件对应一个.h和.cpp文件
- 独立的.ui文件不能生成槽函数框架
- 使用Qt Designer只能设计UI窗体,没有go to slot,不能生成槽函数框架
6. overload型信号处理
- 名称相同,但参数个数或类型不同的信号就是overload型信号
- clicked() 信号生成槽函数可以自动关联
- clicked(bool) 带参数的将当前勾选状态作为参数传递给槽函数
from PyQt5.QtCore import Qt, pyqtSlot @pyqtSlot(bool) # 修饰符指定参数类型,用于overload型信号 def on_chkBoxItalic_clicked(self, checked): font = self.ui.textEdit.font() font.setItalic(checked) self.ui.textEdit.setFont(font)
# overload型信号,需先导入包:from PyQt5.QtCore import Qt, pyqtSlot
# 使用修饰符声明函数参数类型:@pyqtSlot(bool)
# 使用修饰符后connectSlotsByName函数就会自动将信号与槽函数关联
7. 手动关联信号与槽函数
from PyQt5.QtGui import QPalette def do_setTextColor(self): #设置文本颜色 plet = self.ui.textEdit.palette() #获取调色板 if self.ui.radioBlack.isChecked(): plet.setColor(QPalette.Text, Qt.black) elif self.ui.radioBlue.isChecked(): plet.setColor(QPalette.Text, Qt.blue) elif self.ui.radioRed.isChecked(): plet.setColor(QPalette.Text, Qt.red) self.ui.textEdit.setPalette(plet)
* 多个按钮的clicked()信号与一个槽函数关联,在构造函数内增加3条关联语句
* 对象.属性[控件].信号.connect(槽函数)
- self.ui.radioBlack.clicked.connect(self.do_setTextColor)
- self.ui.radioBlue.clicked.connect(self.do_setTextColor)
- self.ui.radioRed.clicked.connect(self.do_setTextColor)