PyQt5实战——UTF-8编码器UI页面设计以及按钮连接(五)

news2024/11/26 0:30:25

个人博客:苏三有春的博客

系类往期文章:
PyQt5实战——多脚本集合包,前言与环境配置(一)
PyQt5实战——多脚本集合包,UI以及工程布局(二)
PyQt5实战——多脚本集合包,程序入口QMainWindow(三)
PyQt5实战——操作台打印重定向,主界面以及stacklayout使用(四)

UTF-8编码器

UTF-8(8位元,Universal Character Set/Unicode Transformation Format)是针对Unicode的一种可变长度字符编码。它可以用来表示Unicode标准中的任何字符,而且其编码中的第一个字节仍与ASCII相容,使得原来处理ASCII字符的软件无需或只进行少部分修改后,便可继续使用。

比如:在蓝牙领域中,主机与从机自身携带的一些信息如蓝牙名称等,就是由UTF-8编码成十六进制字符串后进行传输,在进行蓝牙开发时,就会经常用到UTF-8编码,因此作者也是自做了一个UTF-8编码器集成到自己的脚本工具包中方便使用。

UI设计

首先看成品,这个UTF-8编码器的工作区一共有几个部分组成:
请添加图片描述

  • 编码内容:是读写文本框,在此文本框中,可输入数字,符号,中文,英文等各种可被UTF-8编码的字符串,该文本框为默认形式,即可读可写。
  • 编码结果:是只读文本框,在此文本框中,会显示编码完成后的结果,即十六进制数字组,例如:PyQt5编码后,编码结果会显示0x50, 0x79, 0x51, 0x74, 0x35,此文本框只允许读,复制等操作,不允许改写其中的内容。
  • 字符数:也是只读文本框,在此文本框中,会显示编码结果的字符数,例如:PyQt5编码后,编码结果为5个十六进制数,字符数就为5,值得注意的是,字符数并不是与编码内容的字符串的长度一定相等,如果你的编码内容中含有中文,1个中文则会有3个十六进制数表示。
  • 按钮:按钮连接了一个方法,在按钮被点击时触发方法,读取编码内容中的字符串,进行处理,然后再将结果输出再编码结果字符数中。

功能UI的存放目录

在PyQt的第二篇文章PyQt5实战——多脚本集合包,UI以及工程布局(二)中我们讲到,实现不同功能的UI类是存放在一个相同的目录下,这样方便我们维护,也正是因为功能区的UI放在一个名为Classes的目录下,PrimeWindow不在该目录下。

请添加图片描述

因此PrimeWindow想要调用,实现UTF-8编码器的UI界面,需要使用import

请添加图片描述

这表示:导入Classes目录下的ConvertorClass模块,并重命名为ConvertorClass

可以回到第四篇文章PyQt5实战——操作台打印重定向,主界面以及stacklayout使用(四)查看PrimeWindow如何使用这个模块的(在create_stack方法中)。

代码解释

def __init__

先看初始化代码,也是这个UTF-8对象的入口(这个UTF-8编码器是写在另一个目录下的一个类,上一篇文章中讲到的PrimeWindow就是调用了这个UTF-8编码器类,创建了一个编码器对象,这个类继承于Qwidget,因此这个编码器对象可以被看作是一个Qwidget来使用。)

PS:如果对Qwidget这个概念有些模糊的话请看这里(如果熟悉了PyQt的基本知识请继续往下看),Qwidget本质上是一个组件,和按钮,文本框一样,只不过这个组件中可以放其它的组件,你可以把Qwidget想象成一个容器,这个容器装了许多东西,打包起来,然后再放到另一个容器中,像套娃一样。我们这里就是将上面说的三个文本框与按钮排列好放在一个名为Convertor的Qwidget容器中,然后打包成一个类,可供其它更大的Qwidget(比如PrimeWindow)调用。

    def __init__(self):
        super().__init__()
        
        self.layout = QVBoxLayout() # 设置编码器的主布局为垂直布局VBox
        self.inputlayout = QHBoxLayout() # 设置水平的输入布局,即编码内容(由“编码内容”这四个字的标签与文本框水平布局构成)
        self.outputlayout = QHBoxLayout() # 设置水平的输出布局,即编码结果
        self.countlayout = QHBoxLayout() # 设置水平的计数布局,即字符数
        self.layout.addLayout(self.inputlayout) # 将三个布局以此添加进主布局中
        self.layout.addLayout(self.outputlayout) # 依次添加会按顺序从上往下排列
        self.layout.addLayout(self.countlayout)  # 总的来说是三个小布局垂直分布,每个小布局中的两个组件水平分布
        
        self.inputlable = QLabel("编码内容",self) # 创建“编码内容”这个四个字的标签
        self.inputlayout.addWidget(self.inputlable) # 加入到输入布局中,从左到右排列
        self.inputedior = QTextEdit("输入文本",self) # 创建输入文本框
        TextEditStyle(self.inputedior) # 设置文本框的样式,该方法为作者自写,非第三方库调用
        self.inputlayout.addWidget(self.inputedior) # 将文本框添加到输入布局中
        
        convertbtn = QPushButton("UTF-8编码",self) # 创建按钮,按钮上的文字为“UTF-8编码”
        btnReleaseStyleA(convertbtn) # 设置按钮弹起状态的样式,该方法为作者自写,非第三方库调用
        convertbtn.clicked.connect(self.converting) # 将按钮的点击状态连接到converting方法上,一旦检测到按钮被点击,则调用该方法
        convertbtn.clicked.connect(self.counting) # 同理,将按钮的点击状态连接到counting方法上,一旦检查测到按钮被点击,则调用该方法
        self.layout.addWidget(convertbtn) # 将按钮添加到主布局中,因为上面已经添加了三个小布局,因此按钮在布局最下方

        self.outputlable = QLabel("编码结果",self) # 创建“编码结果”这四个字的标签
        self.outputlayout.addWidget(self.outputlable) # 添加到输出布局中
        self.outputedit = QTextEdit("输出文本",self) # 创建输出文本框
        self.outputedit.setReadOnly(True) # 将文本框设置为只读模式
        TextEditStyle(self.outputedit) # 设置文本框的样式,作者自写,非第三方库嗲用
        self.outputlayout.addWidget(self.outputedit) # 将文本框添加到输出布局中
        
        self.countlable = QLabel("字符数:",self) # 与上相同
        self.countlayout.addWidget(self.countlable)
        self.countedit = QTextEdit("字符数",self)
        self.countedit.setReadOnly(True)
        TextEditStyle(self.countedit)
        self.countlayout.addWidget(self.countedit) 
        # ********************** 已删,不好看 **********************
        # 删除edit边框
        # self.countedit.setFrameShape(QFrame.NoFrame)
        # # 删除edit背景
        # self.countedit.setStyleSheet("background-color: transparent;")
        # ********************** 已删,不好看 **********************
        self.setLayout(self.layout) # 将主布局设置为Qwidget的布局

def converting

converting方法是主要实现UTF-8编码的方法的入口,它并不直接完成该任务,而是获取输入文本框的数据,然后传参给真正的编码方法。

    def converting(self):
        self.text = self.inputedior.toPlainText()
        self.res,self.count = convertor(self.text)
        self.outputedit.setText(self.res)

下面逐行解释代码:

  • 从输入文本框中获取文本内容,在PyQt中,toPlainTextQTextRdit控件的一个方法,用于获取文本框中的所有内容,并返回一个字符串,这与toHtml()不同,后者返回的是HTML格式的文本。
  • 调用convertor这个外部方法,传入的参数就是文本框的内容(字符串),并获取返回结果(两个参数,一个是结果,一个是字符串数)。
  • 将结果设置为输出框的文本。

值得注意的是,这里count变量被形容为self,这也就是说,在同一实例(对象)中,实例中的各个方法(被传入self),都可以调用这个count变量。

def counting

counting方法的作用就是将上面得到的count设置为计数文本框中的内容。

    def counting(self):
        self.countedit.setText(str(self.count))

为什么要舍近求远做这样一个操作呢,是为了提醒我:

  • 一个按钮的某一状态连接多个事件是可行的。
  • 使用setText方法对某一文本框填入数据时,参数必须为字符串,如果非字符串的参数,必须使用str()方法转为字符串。
  • 更深入了解self,可支持某一变量在其它方法间共用。

本文要点

  • 本文中展示了,之前文章中铺垫的,功能区的用法。本质上就是功能区是PrimeWindow这个大的容器(Qwidget)专门空出来的一块地方,可以用来放其它的小的容器(Qwidget),其它的小的容器以对象(实例)的方式被创建,然后存放在抽屉(stack)中,这样我们在切换抽屉时,就是在切换小的容器,实现了大容器不变的情况下,大容器中的某一块区域可以灵活变化。
  • __init__方法是这个对象的入口(创建时被首先调用的函数),当对象被创建时,则会自动地进行初始化,完成整个编译器UI的创建和布局。初始化方法的代码解释写在了代码块中,因为代码较长,如果写出来的话篇幅太大,但是不写的话在CSDN和个人博客中都比较难阅读(无法自动换行),因此建议大家复制下来,贴在VScode中或自己的Typora中看,这样方便一点。
  • 按钮连接的方法是使用xxxbtn.clicked.connect(xxxfunction),该方法旨在某按键被click(点击)时,调用xxxfunction方法,且可以连接多个方法。
  • converting方法实际上是一个处理API的方法,负责传参与接收结果,convertor方法在下一篇文章中会介绍。
  • counting方法可以被整合到converting方法中,不过整个项目是作者的一个学习过程与心得,这样写是为了方便展示一些特性。
  • 如果本文对你有所帮助,请记得给作者的CSDN点赞收藏QAQ,多多逛逛和订阅作者的个人博客,有什么问题或错误请联系作者的CSDN或发送到邮件中,祝大家生活愉快,变得更强!

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

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

相关文章

快速入门CSS

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗 如有错误,欢迎指出~ 目录 CSS css的三种引入方式 css书写规范 选择器分类 标签选择器 class选择器 id选择器 复合选择器 通配符选择器 color颜色设置 border边框设置 width/heigth 内/外边距 C…

【基础】os模块

前言 1、os是operation system(操作系统)的缩写;os模块就是python对操作系统操作接口的封装。os模块提供了多数操作系统的功能接口函数。(OS模块提供了与操作系统进行交互的函数) 2、操作系统属于Python的标准实用程…

Linux---cp命令

Linux cp 命令 | 菜鸟教程 (runoob.com) 命令作用: cp命令主要用于复制文件或目录 语法: cp [options] source dest cp [选项] 源文件 目标文件 source:要复制的文件或目录的名称 dest:复制后的文件或目录的名称 注意:用户使用该指令复制目录时&…

MyBatis-Plus快速入门:从安装到第一个Demo

一、前言 在现代 Java 应用程序中,数据访问层的效率与简洁性至关重要。MyBatis-Plus 作为 MyBatis 的增强工具,旨在简化常见的数据操作,提升开发效率。它提供了丰富的功能,如自动生成 SQL、条件构造器和简单易用的 CRUD 操作&…

【android12】【AHandler】【3.AHandler原理篇AHandler类方法全解】

AHandler系列 【android12】【AHandler】【1.AHandler异步无回复消息原理篇】-CSDN博客 【android12】【AHandler】【2.AHandler异步回复消息原理篇】-CSDN博客 其他系列 本人系列文章-CSDN博客 1.简介 前面两篇我们主要介绍了有回复和无回复的消息的使用方法和源码解析&a…

美发系统——职员绩效和提成——调试过程

一、学会通过现象看本质 首先,通过现象看本质能够让技术研究者更深入地理解问题。在面对技术故障或挑战时,表面的现象往往只是冰山一角,如果只关注表象,可能会采取治标不治本的解决方法。而洞察本质则可以找到问题的根源&#xf…

记一次:Clickhouse同步mysql数据库

ClickHouse可以通过使用MaterializeMySQL引擎来实现与MySQL的数据同步。 前言:因为数据量比较大,既然要分库,为何不让clickhouse同步一下mysql数据库呢? 零、前期准备--mysql的查询和配置 1 查询mysql的配置状态 查询以下语句…

教程:使用 InterBase Express 访问数据库(二)

1. 添加数据模块(IBX 通用教程) 本节将创建一个数据模块(TDataModule),这是一种包含应用程序使用的非可视组件的表单。 以下是完全配置好的 TDataModule 的视图: 创建 TDataModule 后,您可以在其他表单中使用这个数据模块。 2. 添加 TDataModule 要将数据模块添加到…

Matlab实现海马优化算法(SHO)求解路径规划问题

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 海马优化算法(SHO)是一种受自然界海马行为启发的优化算法,它通过模拟海马在寻找食物和配偶时的探索、跟踪和聚集行为来搜索最优解。SHO因其高效的全局搜索能力和局部搜索能力而…

002-Kotlin界面开发之Kotlin旋风之旅

Kotlin旋风之旅 Compose Desktop中哪些Kotlin知识是必须的? 在学习Compose Desktop中,以下Kotlin知识是必须的: 基础语法:包括变量声明、数据类型、条件语句、循环等。面向对象编程:类与对象、继承、接口、抽象类等。…

Unity XR Interaction Toolkit 开发教程(2):导入 SDK【3.0 以上版本】

文章目录 📕课程总结📕安装 Unity 编辑器与打包模块📕导入 OpenXR📕导入 XR Interaction Toolkit📕打包发布 获取完整课程以及答疑,工程文件下载: https://www.spatialxr.tech/ 视频试看链接&a…

clickhouse运维篇(二):多机器手动部署ck集群

熟悉流程并且有真正部署需求可以看一下我的另一篇简化部署的文章,因为多节点配置还是比较麻烦的先要jdk、zookeeper,再ck,还有各种配置文件登录不同机器上手动改配置文件还挺容易出错的。 clickhouse运维篇(三)&#x…

RabbitMQ交换机类型

RabbitMQ交换机类型 1、RabbitMQ工作模型2、RabbitMQ交换机类型2.1、Fanout Exchange(扇形)2.1.1、介绍2.1.2、示例2.1.2.1、生产者2.1.2.2、消费者2.1.2.3、测试 2.2、Direct Exchange(直连)2.2.1、介绍2.2.2、示例2.2.2.1、生产…

MoonNet基准测试更新

基准测试 引言:为了展示MoonNet网络库支持的动态负载均衡功能,我进行了吞吐量测试,以突出其性能表现。由于该库的动态负载均衡策略包括动态线程调度,测试中的线程数变化是不稳定的。这种动态调整使得直接与其他库采用固定线程数的…

RHCE——笔记

nfs服务器 一、简介 NFS(网络文件系统) 允许网络中的计算机(不同的计算机、不同的操作系统)之间通过TCP/IP网络共享资源,主要在unix系列操作系统上使用。在NFS的应用中,本地NFS的客户端应用可以透明地读…

2023年SCRM系统排名分析及市场趋势解读

内容概要 当前,SCRM(社交客户关系管理)系统在企业运营中的重要性日益凸显,尤其是在快速发展的数字经济环境中。2023年的SCRM市场展现出多元化与专业化的趋势,不同企业在客户关系管理方面的需求各有不同,这…

上云管理之Git/GitHub/GitLab 详解(一)

上云管理之Git/GitHub/GitLab 详解(一) 引言1. GIT软件安装2.初始化配置与提交代码2.1. 初始化配置2.2 本地仓库代码提交2.2.1 初始化仓库并提交代码2.2.2 再次提交已修改的代码2.2.3 文件夹层次结构代码提交 2.3 GIT 的文件状态 3.GIT 分支3.1. 分支的切换与删除3.…

10款录屏软件来助你视频回放!!

现在互联网的普及,实时在线视频交流已是家常便饭,有时我们需要进行视频回顾,这就需要借助录屏软件。不管是用于游戏录制、课程制作、教学培训还是项目汇报等, 一款好的录屏软件都能起到事半功倍的效果。今天,我就来跟大…

Python复习2

一、封装函数 #自己封装len函数 s1 "hello,python" print(f"s1的长度为{len(s1)}")def my_len(data):count0for i in data:count 1print(f"{data}的长度为{count}")my_len(s1) 二、容器的排序(排序之后的结果都会变成列表&#xf…

利用EasyExcel实现简易Excel导出

目标 通过注解形式完成对一个方法返回值的通用导出功能 工程搭建 pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&qu…