第五篇 -- 为组件的内建信号编写槽函数

学习书籍《Python Qt GUI与数据可视化编程》

上一节学习的是内部自带的槽函数,这一节学习自己为组件编写槽函数。

回忆一下上一节的图

我们把确定按钮绑定了accept()函数,把退出按钮绑定了close()函数。接下来,我们来看一下清空按钮。

清空:

首先在__init__()里将其绑定一个函数

self.ui.btnClear.clicked.connect(self.clear_text)

其次在myDialog类中编写clear_text()函数

    def clear_text(self):
        self.ui.plainTextEdit.clear()

这样清空按钮的功能就实现了。

提示:如果函数按照on_<object name>_<signal name>(<signal parameters>)命名的话,那么就可以省略绑定函数那一步。如果不绑定,那为什么函数和相应界面组件的信号关联起来了呢,秘密在于Dialog.py文件中的Ui_Dialog.setupUi()函数的最后一行语句

QtCore.QMeteObject.connectSlotsByName(Dialog),使用了Qt的元对象(QMetaObject),它会搜索Dialog窗体上的所有从属组件,将匹配的信号和槽函数关联起来。比如清空按钮槽函数取名为on_btnClear_clicked()。

其他部分类似

myDialog.py

# # 与UI窗体类对应的业务逻辑类
import sys
from PyQt5.QtWidgets import QDialog, QApplication
from PyQt5.QtGui import QPalette
from PyQt5.QtCore import Qt, pyqtSlot
from Dialog import Ui_Dialog

class QmyDialog(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)  # 调用父类构造函数,创建QWidget窗体
        self.ui = Ui_Dialog()  # 创建UI对象
        self.ui.setupUi(self)  # 构造UI

        # ///////////// 自行添加的部分 /////////////

        """
        这部分如果是按照槽函数命名规则命名的,可以注释掉,如果是自己命名的,那么需要加上。
        命名规则:on_<object name>_<signal name>(<signal parameters>)
        如清空按钮就是:on_btnClear_clicked
        """
        # ==================================================================
        # # 添加下划线
        # self.ui.chkBoxUnder.clicked.connect(self.on_chkBoxUnder_clicked)
        #
        # # 修改编辑框中字体为斜体
        # self.ui.chkBoxItalic.clicked.connect(self.on_chkBoxItalic_clicked)
        #
        # # # 修改编辑框中字体为斜体
        # # self.ui.chkBoxItalic.toggled.connect(self.on_chkBoxItalic_toggled)
        #
        # # 添加加粗效果
        # self.ui.chkBoxBold.toggled.connect(self.on_chkBoxBold_toggled)
        #
        # # 添加clear效果
        # self.ui.btnClear.clicked.connect(self.on_btnClear_clicked)
        # ==================================================================

        # 设置颜色关联函数
        self.ui.radioBlack.clicked.connect(self.do_setTextColor)
        self.ui.radioRed.clicked.connect(self.do_setTextColor)
        self.ui.radioBlue.clicked.connect(self.do_setTextColor)

    # #//////////////////自定义槽函数////////////////////

    # 设置文本颜色
    def do_setTextColor(self):
        plet = self.ui.plainTextEdit.palette()   # 获取palette
        if(self.ui.radioBlack.isChecked()):
            plet.setColor(QPalette.Text, Qt.black)
        elif(self.ui.radioRed.isChecked()):
            plet.setColor(QPalette.Text, Qt.red)
        elif(self.ui.radioBlue.isChecked()):
            plet.setColor(QPalette.Text, Qt.blue)
        self.ui.plainTextEdit.setPalette(plet)

    # 将编辑框里面的文字添加下划线
    def on_chkBoxUnder_clicked(self):
        checked = self.ui.chkBoxUnder.isChecked()  # 读取勾选状态
        font = self.ui.plainTextEdit.font()
        font.setUnderline(checked)
        self.ui.plainTextEdit.setFont(font)

    # @pyqtSlot(bool)
    # # 将编辑框里面的文字变为斜体
    # def on_chkBoxItalic_clicked(self, checked):
    #     # checked = self.ui.chkBoxItalic.isChecked()
    #     font = self.ui.plainTextEdit.font()
    #     font.setItalic(checked)
    #     self.ui.plainTextEdit.setFont(font)

    # 将编辑框里面的文字变为斜体
    def on_chkBoxItalic_clicked(self):
        checked = self.ui.chkBoxItalic.isChecked()
        font = self.ui.plainTextEdit.font()
        font.setItalic(checked)
        self.ui.plainTextEdit.setFont(font)

    # # 将编辑框里面的文字变为斜体
    # def on_chkBoxItalic_toggled(self, checked):
    #     # checked = self.ui.chkBoxItalic.isChecked()
    #     font = self.ui.plainTextEdit.font()
    #     font.setItalic(checked)
    #     self.ui.plainTextEdit.setFont(font)

    # 将编辑框里面的内容加粗
    def on_chkBoxBold_toggled(self, checked):
        font = self.ui.plainTextEdit.font()
        font.setBold(checked)  # 参数checked表示勾选状态
        self.ui.plainTextEdit.setFont(font)

    # 清除编辑框里面的内容函数
    def on_btnClear_clicked(self):
        self.ui.plainTextEdit.clear()

if __name__ == "__main__":
    app = QApplication(sys.argv)  # 创建app,用QApplication类
    form = QmyDialog()
    form.show()
    sys.exit(app.exec_())

注意,代码中关于斜体部分,举了3种方式,都可以实现其效果,其中有一种是@pyqtSlot(bool),这是overload型信号

overload型信号的处理,在QCheckBox类组件中,有两个名称为clicked的信号,一个是不带参数的clicked()信号,使用这个信号生成槽函数是可以自动关联的;另一个是带参数的clicked(bool)信号,它将复选框的当前勾选状态作为参数传递给槽函数。这种名称相同但参数个数或类型不同的信号就是overload型信号。connectSlotsByName()函数进行信号与槽函数的关联时会使用一个默认的信号,对QCheckBox来说,默认使用的是不带参数的clicked()信号,而如果定义on_chkBoxItalic_clicked(self,checked)是需要传递进来一个参数的,那么如果想要使用这个槽函数,就需要使用@pyqtSlot修饰符,用这个修饰符将函数的参数类型声明清楚。,这样,connectSlotsByName()函数就会自动使用clicked(bool)信号与这个槽函数关联,运行就没问题。

原文地址:https://www.cnblogs.com/smart-zihan/p/12651364.html

时间: 2024-08-29 06:49:09

第五篇 -- 为组件的内建信号编写槽函数的相关文章

Vue基础篇--8组件基础 component

Vue基础篇--8组件基础 component 1.简单示例 <div id='components1'> <button-conter></button-conter> </div> <script> // 定义一个名为button-conter组件 Vue.component("button-conter",{ data:function () { return { count:0 } }, template:`<b

第四章 内建组件

介绍 angular2提供了很多内建的组件,在这一章,我们会分别介绍它们,并展示一些怎么使用它们的例子. :fa-info-circle:内建组件可以直接导入到项目中来,而不需要像我们前面介绍一样使用directives导入 NgIf 当你想要根据一个特定的条件显示或者隐藏一个组件的时候,你可以使用NgIf,条件是一个返回boolean类型的ng2的表达式. 如果表达式返回false,元素将从DOM树种移除,如果为true,则会显示. <div *ngIf="false" >

Angular基础(五) 内建指令和表单

? Angular提供了一些内建的指令,可以作为属性添加给HTML元素,以动态控制其行为. 一.内建指令 a) *ngIf,可以根据条件来显示或隐藏HTML元素. <div *ngIf='a>b'>show</div>,只有在a>b的时候才会显示这个div. b)*ngSwitchCase,可以根据不同的条件,控制对应的HTML元素的显示. <div[ngSwitch]='myVar'> <div *ngSwitchCase="'a'&quo

Cassandra内建的工具nodetool - 监控篇

Cassandra 常用监控命令 Cassandra 自带了多个功能强大集群或数据管理工具,数量掌握有助于诊断和维护Cassandra集群.快速解决各种问题: nodetool nodetool是一个命令行的工具集,它可以监控Cassandra和执行例行的数据库操作.作为内建的工具,nodetool一般用于在节点上直接运行.nodetool工具集支持大多数重要的JMX指标和操作,并且包含了一些为管理员准备的命令. 相关命令如下: nodetool: 是一个命令行的工具集,它可以监控Cassand

【Python五篇慢慢弹(5)】‘类’过依然继续前行,直至ending再出发

‘类’过依然继续前行,直至ending再出发 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给出的pythondoc入门资料包含了基本要点.本文是对文档常用核心要点进行梳理,简单冗余知识不再介绍,作者假使你用c/java/c#/c++任一种语言基础.本系列文章属于入门内容,老鸟可以略看也可以略过,新鸟可以从篇一<快速上手学python>先接触下python怎样安装与运行,以及pychar

python基础-常用内建模块

一.collections:内建集合模块. 1.namedtuple:创建一个自定义的tuple对象 2.deque:为了高效实现插入和删除操作的双向列表,适合用于队列和栈 3.defaultdict:Key不存在时返回默认值 4.OrderedDict:保持Key的顺序 5.Counter:一个简单的计数器 二.base64 : 一种用64个字符来表示任意二进制数据的方法 三.struct : str和其他二进制数据类型的转换 四.hashlib : 提供常见的摘要算法,如MD5,SHA1 五

SQL Server索引设计 &lt;第五篇&gt;

SQL Server索引的设计主要考虑因素如下: 检查WHERE条件和连接条件列: 使用窄索引: 检查列的选择性: 检查列的数据类型: 考虑列顺序: 考虑索引类型(聚集索引OR非聚集索引): 一.检查WHERE条件列和链接条件列 当一个查询提交到SQL Server时,查询优化器尝试为查询中引用的所有表查找最佳的数据访问机制.下面列出查询优化器针对WHERE和连接的工作方式: 优化器识别WHERE子句和连接条件中包含的列. 接着优化器检查这些列上的索引. 优化器通过从索引上维护的统计确定子句的选

ASP基础教程:ASP内建对象Response

在上一篇中作者给大家详细介绍了 ASP 内建对象之一 Request 的使用方法,相信各位通过一系列的实践已经能够熟练掌握,本篇将继续给大家介绍 ASP 的另一个内建对象 Response. 最近,有很多朋友来“妹儿”催我加快 ASP 篇一文的写作速度,并急切地询问哪里有关于 ASP 的教材.我深深地被大家的学习热情所打动,因此决定将自己平时所搜集的一些 ASP 信息资料拿出来和大家共享,也希望所有的朋友能慷慨地将自己搜集的有关 ASP 的资料告诉作者,谢谢.由于目前国内有关 ASP 的中文教材

ASP基础教程:ASP内建对象Server

通过前九篇的理论和实践,相信大家已经对 ASP 有了系统的了解,虽然至今为止,我们只学了 ASP 的 4 个内建对象,但已经完全能够写出一些实用的小程序了.今天,作者将继续给大家讲解最后一个 ASP 内建对象——Server. 在开始本次课程之前,我仍要在这里回答一些朋友们提出的比较普遍的问题.最近仍有不少朋友来信问我,如何构建服务器端的 Active Server Page 环境.我想可能是我在前几篇中没有讲清楚,因此,在本篇的开头有必要把这个问题详细阐述一遍. ASP 的应用完全是基于 Mi