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() # 设置编码器的主布局为垂直布局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或发送到邮件中,祝大家生活愉快,变得更强!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【网络面试篇】HTTP(2)(笔记)——http、https、http1.1、http2.0

目录 一、相关面试题 1. HTTP 与 HTTPS 有哪些区别? 2. HTTPS 的工作原理?(https 是怎么建立连接的) (1)ClientHello (2)SeverHello (3)客户端回应 &a…

【VScode】中文版ChatGPT编程工具-CodeMoss!教程+示例+快捷键

文章目录 1. 多模型选择2. 编辑快捷键3. 历史记录收藏 CodeMoss使用教程1. 安装CodeMoss插件2. 配置AI模型3. 使用快捷键4. 进行代码优化与解释5. 收藏历史记录 总结与展望 在当今快速发展的编程世界中,开发者们面临着越来越多的挑战。如何提高编程效率,…

JqGird 动态生成列使用

使用场景: 在工作用需要自定义动态生成列,通过选择下拉框,加载列,通过查询加载列对应的数据信息 当选择文件源任务显示三列 当选择数据源任务显示两列 处理方式: 1. 首先在刚进入界面时初始化控件 $("#pageGri…

STM32Fxx读写eeprom(AT24C16)

一.I2C 协议简介 I2C 通讯协议 (Inter - Integrated Circuit) 是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个…

鸿蒙系统的优势 开发 环境搭建 开发小示例

HarmonyOS是面向多智能终端、全场景的分布式操作系统,为消费者提供跨终端的无缝体验.华为开发者联盟从HarmonyOS应用设计、开发、测试、推广变现等环节全方位助力开发者。 开发者可以通过以下步骤学习鸿蒙系统的开发: 基础理论学习: 了解鸿蒙系统概述&a…

「C/C++」C/C++的区别

✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

Windows部署rabbitmq

本次安装环境: 系统:Windows 11 软件建议版本: erlang OPT 26.0.2rabbitmq 3.12.4 一、下载 1.1 下载erlang 官网下载地址: 1.2 下载rabbitmq 官网下载地址: 建议使用解压版,安装版可能会在安装软件…

el-table 滚动条重置 手动控制滚动条

最近在使用 el-table 的时候,出现一个问题: 表头过长的时候,会有左右滑动的操作,当我们把表格拉到最右侧,这个时候重新请求数据的话,表格位置还是在最右侧,不会恢复原位。 那我们想恢复原位&a…

推荐FileLink数据跨网摆渡系统 — 安全、高效的数据传输解决方案

在数字化转型的浪潮中,企业对于数据传输的需求日益增加,特别是在不同网络环境之间的文件共享和传输。为了满足这一需求,FileLink数据跨网摆渡系统应运而生,为企业提供了一种安全、高效的数据传输解决方案。 安全第一,保…

STl学习-迭代器

1.迭代器种类 这五种迭代器的声明如下: truct output_iterator_tag {};//输出迭代器 truct input_iterator_tag{ };//输入迭代器 truct forward iterator tag : public input iterator tag {};//向前迭代器 truct bidirectional iterator tag :public forward iter…

自适应对话式团队构建,提升语言模型代理的复杂任务解决能力

人工智能咨询培训老师叶梓 转载标明出处 如何有效利用多个大模型(LLM)代理解决复杂任务一直是一个研究热点。由美国南加州大学、宾夕法尼亚州立大学、华盛顿大学、早稻田大学和谷歌DeepMind的研究人员联合提出了一种新的解决方案——自适应团队构建&…

临街矩阵乘以自己转置的含义

总结: 临街矩阵* 邻接矩阵转置的(i,j) 位置表示有多少种线路从元素A跳转一条边最终落到元素j的路线. 这个也叫1_degree.

JavaEE-多线程初阶(3)

目录 1.线程的状态 1.1 NEW、RUNNABLE、TERMINATED 1.2 TIMED_WAITING 1.3 WAITING 1.4 BLOCKED 2.多线程带来的风险-线程安全(重点) 2.1 观察线程不安全的现象 2.2 分析产生该现象的原因 2.3 产生线程安全问题的原因 2.3.1 抢占式执行&#x…

江协科技STM32学习- P35 硬件I2C读写MPU6050

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

学习虚幻C++开发日志——定时器

官方文档:虚幻引擎中的Gameplay定时器 | 虚幻引擎 5.5 文档 | Epic Developer Community | Epic Developer Community 定时器 安排在经过一定延迟或一段时间结束后要执行的操作。例如,您可能希望玩家在获取某个能力提升道具后变得无懈可击,…

【简道云 -注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

【表格解决问题】EXCEL行数过多,WPS如何按逐行分别打印多个纸张中

1 问题描述 如图:我的表格行数太多了。打印在一张纸上有点不太好看 2 解决方式 Step01:先选中你需要打印的部分,找到【页面】->【打印区域】->【设置打印区域】 Step02:先选中一行,找到【插入分页符】 Step0…

提高交换网络可靠性之链路聚合

转载请注明出处 该实验为链路聚合的配置实验。 1.改名,分别将交换机1和交换机2改名为S1,S2,然后查看S1,S2的STP信息。以交换机1为例👇。 2.交换机S1,S2上创建聚合端口,将端口加入聚合端口。以S…

SpringMVC笔记 一万字

此笔记来自于B站尚硅谷 文章目录 一、SpringMVC 简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点 二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式:warc>引入依赖 3、配置web.xmla>默认配置方式b>扩展配置方式 4、创建请求…

【Hive sql面试题】找出连续活跃3天及以上的用户

表数据如下: 要求:求出连续活跃三天及以上的用户 建表语句和插入数据如下: create table t_useractive(uid string,dt string );insert into t_useractive values(A,2023-10-01 10:10:20),(A,2023-10-02 10:10:20),(A,2023-10-03 10:16…