12. 为组件的内建信号编写槽函数

//自动关联槽函数

1. 清空

  -  选中清空按钮右键 -> Go to slot -> clicked()

    # QpushButton类的按钮常用的信号是clicked,就是点击发射信号

  -  复制函数名称在myDialog.py文件的QmyDialog类下定义同名函数

 def on_btnClear_clicked(self):
        self.ui.textEdit.clear()
View Code

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)
View Code

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)    
View Code

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)
View Code

# 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)
View Code

  * 多个按钮的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)

posted @ 2020-12-02 13:51  GOgo学习  阅读(140)  评论(0编辑  收藏  举报