PyQt5编程基础 2.2 信号与槽函数

news2024/11/18 17:24:47

信号与槽函数

信号(Signal)

信号是在特定情况下被发射的一种通告。举例:

PushButton的信号是鼠标单击时发射的clicked信号

槽(Slot)

对信号相应的函数。举例:

Qwidget有一个槽函数,功能是关闭窗口

信号与槽的关系

一个信号可以关联多个槽函数

一个信号可以关联其他信号

信号的参数可以是任何Python数据类型

一个槽函数可以和多个信号关联

关联可以是直接的(同步)或排队的(异步)

可以在不同的线程之间建立关联

信号与槽可以断开关联

本次例子实现具体效果

实现效果类似于自定义字体的颜色,大小和样式等等,效果图如下

创建目录

e:\baikejia\bkj2-3

创建Qt项目QtApp

e:\baikejia\bakj2-3\QtAp

注意选择QDialog作为基类

组件布局管理

初始窗体

放一个GroupBox和三个CheckBox

在窗体上部放一个Group Box,Group Box的title属性设为空。

往Group Box放三个CheckBox组件,不用刻意去调整位置

三个CheckBox的ObjectName分别设为chkBoxUnder、chkBoxItalic、chkBoxBold,text分别设为Underline、Italic、Bold,其中chkBoxUnder的checked属性打勾

放好后,右侧Object inspector应该如图所示

窗体显示如下

现在看起来,很不整齐

选中GroupBox,点击上方的水平布局按钮

点完后变整齐了

放一个GroupBox和三个Radio Button

三个Radio Button的ObjectName分别为radioBlack、radioRed、radioBlue,text分别为Black、Red、Blue,其中radioBlack的checked属性打勾

窗体是这样的

点击水平布局按钮后,窗体变成了这样

放一个PlainTextEdit

设置ObjectName为textEdit

放一个Horizontal Layout

在Horizontal Layout上面放三个PushButton和两个Horizontal Spacer

放一个Push Button

再放一个Push Button

再放一个Push Button

放一个Horizontal Spacer

再放一个Horizontal Spacer

放好后窗体如图所示

修改三个Push Button的ObjectName分别为:btnClear、btnOK、btnClose,Text分别为“清空”、“确定”、“关闭”

设置窗体布局

点窗体空白处,选中窗体

点击工具栏中的垂直布局按钮

窗口布局调整如下

适当改动窗口大小,形成如下最终窗体

设置组件tab顺序

点击工具栏上方的Edit Tab Order按钮

窗体显示如下

在理想的第一个Tab上点击右键,选择重新开始。如上图就在Underline左侧的5上点右键

点工具栏的❌关闭

设置信号和槽

对话框类Qdialog内置槽函数

accept():关闭对话框,表示肯定的选择,例如“确定”

reject():关闭对话框,表示否定的选择,例如“取消”

close():关闭对话框

将确定按钮与accept()槽函数关联

点击工具栏上的Edit Signals/Slots按钮

鼠标点击选中确定按钮,按住鼠标左键拖动到窗体空白区域后释放左键,弹出关联设置对话框

左边选clicked,右边选accept(),然后点OK。

底部的Signals Slots Editor出现一条数据

将关闭按钮与close()槽函数关联

右边没有close按钮,要选显示从QWidget继承的信号和槽

保存Qt项目,将ui文件拷贝到Eric6目录中

Eric6下创建项目

项目下只有一个__init__.py文件

选择窗体,编译

编译后查看文件

上面红色框框中的两行代码就是刚刚建好的信号与槽的关联

创建窗体业务逻辑类

按照界面与业务逻辑分离且界面独立封装的方式定义一个类QmyDialog,保存为myDialog.py。代码如下:

##与UI窗体类对应的业务逻辑类
import sys
from PyQt5.QtWidgets import  QApplication, QDialog
from Ui_Dialog import Ui_Dialog

class QmyDialog(QDialog): 
   def __init__(self, parent=None):
      super().__init__(parent)   #调用父类构造函数,创建窗体
      self.ui=Ui_Dialog()        #创建UI对象
      self.ui.setupUi(self)      #构造UI界面
   
if  __name__ == "__main__":         #用于当前窗体测试
   app = QApplication(sys.argv)     #创建GUI应用程序
   form=QmyDialog()                 #创建窗体
   form.show()
   sys.exit(app.exec_())

运行myDialog

myDialog可以直接运行

确定和退出两个按钮都可以正常使用。

这是因为在QmyDialog的构造函数__init__中创建了窗体类的实例对象self.ui,并调用了setupUi()函数。而SetupUi()函数实现了这两个按钮的信号与窗体相关槽函数的关联。

其他按钮还没填代码,所以不行。

建立应用程序主程序文件appMain.py

myDialog.py可以当作主程序直接运行,但是建议单独编写一个主程序文件appMain.py。

该文件的功能是创建应用程序和主窗体,然后显示主窗体,并开始运行应用程序。

appMain.py将myDialog.py文件的测试运行部分单独拿出来作为一个文件

当一个应用程序有多个窗体,并且窗体之间有数据传递时,appMain.py负责创建应用程序的主窗体并运行起来,这样使整个应用程序的结构更清晰

appMain.py的代码如下:

##  GUI应用程序主程序

import sys
from PyQt5.QtWidgets import  QApplication
from myDialog import QmyDialog
    
app = QApplication(sys.argv)     #创建GUI应用程序
mainform=QmyDialog()             #创建主窗体
mainform.show()                  #显示主窗体
sys.exit(app.exec_())

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

清空按钮

为清空按钮添加槽函数

进入Qt Creator,右键点击清空按钮,选择转到槽

选择clicked

在弹出的文件中复制函数名

进入Eric6,在myDialog.py文件的QmyDialog类里定义一个同名函数并编写代码

添加PlainText的初始化函数

在Ui_Dialog.py中添加如下函数

在myDialog.py中添加对这个函数的调用

运行程序

按清空按钮

内容被清空

Bold复选框

编写代码

进入Qt Creator,为Bold复选框设置槽函数,选toggled(bool)

记下函数名

在myDialog.py文件的QmyDialog类里定义一个同名函数,并且具有相同类型的参数

运行程序

选择Bold复选框

可以看到里面字体加粗了

取消Bold复选框

字体没有加粗了

Underline复选框

编写代码

在Qt Creator中为Underline复选框添加槽函数,选择clicked()

在Ui_Dialog.py中添加如下函数

修改Ui_Dialog.py中的SetupUI函数

修改后变成

运行程序

选中Underline

信号与槽的管理是如何实现的

在QmyDialog类里定义了三个函数,这三个函数就与相应界面组件的信号关联起来了

在QmyDialog类的构造函数里并没有任何代码实现信号与槽的关联,Ui_Dialog也没有做任何修改。这些信号与槽的关联是怎么实现的?

看Ui_Dialog.py的SetupUi()函数的这一条语句

功能是搜索Dialog窗体上的所有从属组件,将匹配的信号和槽函数关联起来。只有符合命名规则的槽函数才会被匹配。不符合命名规则的函数不能自动与信号关联。

overload型信号的处理

Italic复选框

找到槽函数名

在Qt Creator中为Italic复选框设置槽函数,选择clicked(bool)

注意有一个clicked(),还有一个clicked(bool)。这两个都是clicked信号。默认情况下,connectSlotsByName只会关联默认的不带参数的clicked信号,不会关联带参数的clicked(bool)信号

要解决这个问题,需要使用@pyqtSlot修饰符,将函数的参数类型声明清楚

编写代码

在Ui_Dialog.py中添加如下函数

有警告,是因为import少了模块

这是myDialog.py中原有的import

添加import 模块

加了后,上面代码中的警告取消了

运行程序

手动关联信号与槽函数

实现设置颜色的三个RadioButton按钮的clicked()信号与同一个槽函数关联

添加import模块

添加自定义槽函数

在QmyDialog类里顶一个自定义槽函数do_setTextColor(self)

在构造函数中关联信号和槽函数

这就将三个RadioButton的clicked信号与同一个槽函数关联起来了

运行程序

补丁

问题

突然发现RadioBlue的text属性错了,郁闷

返回Qt Creator中将RadioBlue的text改为Blue

保存ui文件后,将e:\baikejia\bkj2-3\QtApp目录的Dialog.ui拷贝到e:\baikejia\bkj2-3下,覆盖原Dialog.ui文件

记得要在Eric6下重新编译form

运行出错

重新运行,发现报错

这是因为重新编译了ui文件,导致ui_Dialog.py文件内容更新,刚才在里面放的do_setTextEdit被冲掉了。只好补回去

补充代码

运行程序

终于好了。注意要运行appMain.py,不要运行Ui_Dialog.py

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/195130.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Uncaught SyntaxError: Unexpected token ... 【bug记录】vue项目发布

项目场景: 项目场景:部署vue项目,组件或页面html使用ES6语法导致,界面无法显示。 客户那边采用了比较低版本的浏览器,自己电脑上却没有出现,也不方便调试测试。 问题描述 打开来控制台,看到异…

单片机开发---ESP32S3移植NES模拟器(一)

书接上文 《单片机开发—ESP32-S3模块上手》 《单片机开发—ESP32S3移植lvgl触摸屏》 参考内容 依旧是参考韦东山老师的作品来移植的 《ESP32|爷青回!ESP32(单片机) NES模拟器_NES游戏机掌机教程(开源详细讲解实现代码!)》 韦老师已经将代码开源&am…

深入解读神策分析云两大闭环,助力企业全面数字化转型应用

随着市场的发展、客户的深度使用以及全新的产品认知,神策希望能够帮助企业客户构建拥有正向反馈、持续提升、优化经营效率的数据应用闭环。本次,神策在用户行为分析的基础上,对分析云的整体产品架构进行全面升级,不仅包括公私域流…

json字符带有反斜杠\处理

目录说明说明 json字符带有反斜杠\&#xff0c;需要转义处理 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-text</artifactId><version>1.6</version></dependency>String json "{\"n…

解决安装2.4版本的percona-xtrabackup和5.6版本的mysql冲突的问题

问题描述&#xff1a;在阿里云上有一个5.6版本的mysql&#xff0c;想把备份的数据恢复到本地。按照阿里云的文档描述&#xff0c;本机mysql的版本也得是5.6&#xff0c;percona-xtrabackup版本得是2.4。于是开始动手操作&#xff0c;无非是在本机安装5.6版本的mysql和2.4版本的…

【C++】C++11语法 ~ 可变参数模板

&#x1f308;欢迎来到C专栏~可变参数模板 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句鸡汤&…

2月3日第壹简报,星期五,农历正月十三

2月3日第壹简报&#xff0c;星期五&#xff0c;农历正月十三坚持阅读&#xff0c;静待花开1. 香港&#xff1a;将向世界各地旅客派发50万张免费机票&#xff0c;3月1日起派发&#xff0c;为期6个月&#xff0c;率先向东南亚地区送出。2. 我国新增18处国际重要湿地&#xff0c;湿…

聚观早报|网易开放暴雪游戏退款申请通道;鱼跃医疗回应被罚270万

今日要闻&#xff1a;网易开放暴雪游戏退款申请通道&#xff1b;谷歌 ChatGPT 竞品搜索设计将迎来大改&#xff1b;“鱼跃医疗”回应被罚270万元&#xff1b;大众考虑在加拿大建设新的电池工厂&#xff1b;微软将把ChatGPT整合到必应搜索中网易开放暴雪游戏退款申请通道 2 月 1…

力扣刷题|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

LeetCode 654.最大二叉树 题目链接&#x1f517; LeetCode 654.最大二叉树 思路 最大二叉树的构建过程如下&#xff1a; 构造树一般采用的是前序遍历&#xff0c;因为先构造中间节点&#xff0c;然后递归构造左子树和右子树。 class Solution {public TreeNode constructM…

构造http请求的几种方式(附源码)

文章目录前言一、form表单构造http请求二、ajax构造http请求三、Java socket构造http请求总结前言 博主个人社区&#xff1a;开发与算法学习社区 博主个人主页&#xff1a;Killing Vibe的博客 欢迎大家加入&#xff0c;一起交流学习~~ 一、form表单构造http请求 form (表单) 是…

SSH基础知识(一)

SSH基础知识SSH对称加密非对称加密如何生成秘钥如何管理秘钥不同版本ssh命令安装ssh启动ssh服务登录ssh退出ssh登录远程登录执行命令ssh参数端口转发本地转发远程转发动态转发最近有用到SFTP协议完成一些功能开发&#xff0c;这玩意和FTP比较像&#xff0c;当时以为是升级版&am…

FPGA和CPLD芯片选型介绍(二)

FPGA器件选型&#xff08;以Xilinx和Altera为例&#xff09;器件选型是件很严肃的事情&#xff0c;既要考虑性能又要兼顾成本&#xff0c;还要考虑长期供货的稳定性&#xff0c;因此很考验工程师的知识广度储备。一般而言&#xff0c;FPGA&#xff08;CPLD&#xff09;需要分三…

3、Maven——Maven创建java web工程,Maven search插件

目录 一、Maven创建java web工程 二、Maven创建java web项目的结构 1、添加项目目录 2、web.xml配置处理报错 三、IDEA更改XML版本 一、Maven创建java web工程 创建Empty Project空工程&#xff1b;右击Empty Project工程--->New--->Module--->Maven Archetype N…

Linux环境下安装软件合集【2】

Linux环境下安装软件合集【2】 Linux环境下安装软件合集【1】 1 安装tomcat 1.1 安装启动tomcat 下载tomcat压缩包 通过wget方式 wget --no-check-certificate https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.70/bin/apache-tomcat-9.0.70.tar.gz直接官网下载压缩包&…

23k入职腾讯测试岗那天,我哭了,这5个月付出的一切总算没有白费~

先说一下自己的个人情况&#xff0c;计算机专业&#xff0c;16年普通二本学校毕业&#xff0c;经历过一些失败的工作经历后&#xff0c;经推荐就进入了华为的测试岗&#xff0c;进去才知道是接了个外包项目&#xff0c;不太稳定的样子&#xff0c;可是刚毕业谁知道什么外包不外…

基于SSH框架的学生成绩管理系统源码+数据库,Struts2、Spring与Hibernate整合应用,实验报告

Struts2、Spring与Hibernate整合应用&#xff1a;基于SSH框架的学生成绩管理系统 最近一个实验课程&#xff0c;需要做一个基于SSH框架的学生成绩管理系统。就简简单单做了一下…… 1.1 实验要求&#xff1a; &#xff08;1&#xff09; 整合Struts2、Spring和Hibernate框架 …

​箭头函数和普通函数的区别​

一.外形不同&#xff1a;箭头函数使用箭头定义&#xff0c;普通函数中没有 代码实例如下&#xff1a; // 普通函数 function func(){// code } // 箭头函数 let func()>{// code } 二.箭头函数都是匿名函数 普通函数可以有匿名函数&#xff0c;也可以有具体名函数&#xf…

框架高级课程系列之Redis6笔记

文章目录前言NoSQL数据库简介技术发展NoSQL数据库NoSQL适用场景NoSQL不适用场景Redis概述安装配合关系型数据库做高速缓存多样的数据结构存储持久化数据Redis 安装准备工作&#xff1a;下载安装最新版的gcc编译器启动 Redis方式Redis 关闭方式Redis介绍相关知识常用五大数据类型…

如何利用python机器学习解决空间模拟与时间预测问题及经典案例分析

目录 专题一 机器学习原理与概述 专题二 Python编译工具组合安装教程 专题三 掌握Python语法及常见科学计算方法 专题四 机器学习数据清洗 专题五 机器学习与深度学习方法 专题六 机器学习空间模拟实践操作 专题七 机器学习时间预测实践操作 更多推荐 了解机器学习的发…

Web服务器TomCat快速入门(从安装到部署)

文章目录什么是Web服务器&#xff1f;相关概念基本使用下载安装卸载启动关闭配置部署&#x1f4c2;橙子精品文章学习推荐什么是Web服务器&#xff1f; Web 服务器是一个应用程序&#xff0c;对 HTTP 协议的操作进行封装&#xff0c;使得程序员不必直接对协议进行操作&#xff…