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

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

系类往期文章:
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() # 设置编码器的主布局为垂直布局VBoxself.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.xdnf.cn/news/7355.html

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

相关文章

Call For Speaker! |2025中国国际音频产业大会(GAS)演讲嘉宾征集令启动!

2025中国国际音频产业大会(GAS)已定档2025年3月26-27日。 GAS 2025演讲嘉宾征集正式启动!我们将再次汇聚音频领域的专家和行业领袖,力求为与会者呈现一场内容丰富、精彩纷呈的知识盛宴。 SPRGASING FESTIVAL 如果 您在音频领域…

安装docker-compose

安装包地址https://github.com/docker/compose/releases wget https://github.com/docker/compose/releases/download/v2.30.3/docker-compose-Linux-x86_64 mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose chmod x /usr/local/bin/docker-compose docker-com…

【355】基于springboot的助农管理系统

助农管理系统的设计与实现 摘要 近年来,信息化管理行业的不断兴起,使得人们的日常生活越来越离不开计算机和互联网技术。首先,根据收集到的用户需求分析,对设计系统有一个初步的认识与了解,确定助农管理系统的总体功…

计算机网络——TCP篇

TCP篇 基本认知 TCP和UDP的区别? TCP 和 UDP 可以使用同一个端口吗? 可以的 传输层中 TCP 和 UDP在内核中是两个完全独立的软件模块。可以根据协议字段来选择不同的模块来处理。 TCP 连接建立 TCP 三次握手过程是怎样的? 一次握手:客户端发送带有 …

PyQt5实战——UTF-8编码器功能的实现(六)

个人博客:苏三有春的博客 系类往期文章: PyQt5实战——多脚本集合包,前言与环境配置(一) PyQt5实战——多脚本集合包,UI以及工程布局(二) PyQt5实战——多脚本集合包,程序…

闯关leetcode——3222. Find the Winning Player in Coin Game

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/find-the-winning-player-in-coin-game/description/ 内容 You are given two positive integers x and y, denoting the number of coins with values 75 and 10 respectively. Alice and Bob a…

中缀表达式求值-acwing

题目: 3302. 表达式求值 - AcWing题库 解析:模拟 2*10-100024-(5*3)(3*2) 使用两种栈: 遍历:(暂时用it指向) it : 2 存入 num {2} it:* 栈空,存入 op{*} it:…

使用代理时Stable Diffusion无法正常下载各类模型的解决办法

最近发现了 Stable Diffusion 这个好玩的ai绘画工具,不得不感叹现在ai工具已经进化到这么简单易用的程度,只要下载对应的模型就可以生成各种有意思的图片 就算你没有编程基础,跟着教程也能弄出来 不过使用过程中发现部分功能无法使用 查看日…

从0开始机器学习--Day17--神经网络反向传播作业

题目:识别数字0-9,做梯度检测来验证是否在梯度下降过程中存在问题,并可视化隐藏层 代码: import numpy as np import scipy.io as sio import matplotlib.pyplot as plt from scipy.optimize import minimizedef sigmoid(z):ret…

前端学习笔记-Ajax篇

第1章:原生AJAX 1.1Ajax简介 AAX 全称为 Asynchronous JavaScript And XML,就是异步的 JS 和 XML。 通过 AAX 可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据。 AAX 不是新的编程语言,而是一种将现有的标准组合在一起使用…

【Python爬虫实战】DrissionPage 与 ChromiumPage:高效网页自动化与数据抓取的双利器

🌈个人主页:易辰君-CSDN博客 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、DrissionPage简介 (一)特点 (二)安装 (三…

Halcon基于laws纹理特征的SVM分类

与基于区域特征的 SVM 分类不同,针对图像特征的 SVM 分类的算子不需要直接提取 特征,下面介绍基于 Laws 纹理特征的 SVM 分类。 纹理在计算机视觉领域的图像分割、模式识别等方面都有着重要的意义和广泛的应 用。纹理是指由于物体表面的物理属性不同所…

Netty篇(入门编程)

目录 一、Hello World 1. 目标 2. 服务器端 3. 客户端 4. 流程梳理 💡 提示 5. 运行结果截图 二、Netty执行流程 1. 流程分析 2. 代码案例 2.1. 引入依赖 2.2. 服务端 服务端 服务端处理器 2.3. 客户端 客户端 客户端处理器 2.4. 代码截图 一、Hel…

从0开始学习机器学习--Day14--如何优化神经网络的代价函数

在上一篇文章中,解析了神经网络处理分类问题的过程,类似的,在处理多元分类问题时,神经网络会按照类型分成多个输出层的神经元来表示,如下: 处理4个分类问题时的神经网络 我们可以看到,相较于之…

除草机器人算法以及技术详解!

算法详解 图像识别与目标检测算法 Yolo算法:这是目标检测领域的一种常用算法,通过卷积神经网络对输入图像进行处理,将图像划分为多个网格,每个网格生成预测框,并通过非极大值抑制(NMS)筛选出最…

Android MavenCentral 仓库更新问题

MavenCentral 仓库更新问题 前言正文一、Maven central repository的账户迁移二、获取加密账户信息三、问题和解决方式① 问题1② 解决1③ 问题2④ 解决2 前言 在去年的3、4月份的时候我发布了一个开源库EasyView,在MavenCentral上,可以说当时发布的时候…

腾讯为什么支持开源?

今天看到一条新闻,感觉腾讯在 AI 大模型方面确实挺厉害的,符合它低调务实的风格,在不知不觉中一天竟然开源了两个核心的,重要的 AI 大模型。 据新闻报道,11月 5 日,腾讯混元宣布最新的 MoE 模型“混元 Larg…

学习了,踩到一个坑!

前言 踩坑了啊,最近踩了一个 lombok 的坑,有点意思,给你分享一波。 我之前写过一个公共的服务接口,这个接口已经有好几个系统对接并稳定运行了很长一段时间了,长到这个接口都已经交接给别的同事一年多了。 因为是基…

『Django』APIView基于类的用法

点赞 关注 收藏 学会了 本文简介 上一篇文章介绍了如何使用APIView创建各种请求方法,介绍的是通过函数的方式写接口。 本文要介绍 Django 提供的基于类(Class)来实现的 APIView 用法,代码写起来更简单。 APIView基于类的基…

CentOS系统查看CPU、内存、操作系统等信息

Linux系统提供了一系列命令可以用来查看系统硬件信息,如CPU的物理个数、核数、逻辑CPU数量、内存信息和操作系统版本。 查看物理CPU、核数和逻辑CPU 在多核、多线程的系统中,了解物理CPU个数、每个物理CPU的核数和逻辑CPU个数至关重要。超线程技术进一步…