【Qt】解决设置QPlainTextEdit控件的Tab为4个空格
前言
PyQt5 是一个用于创建跨平台桌面应用程序的 Python 绑定集合,它提供了对 Qt 应用程序框架的访问。用于开发具有图形用户界面(GUI)的应用程序,以及非GUI程序。PyQt5 使得 Python 开发者可以使用 Qt 的丰富功能来构建应用程序。
QPlainTextEdit是 Qt 框架中的一个纯文本编辑器控件,它提供了一个高级的文本编辑和显示功能,专门用于处理纯文本数据。
使用QPlainTextEdit可作为文本显示控件,支持显示与编辑的功能,但是在编辑过程中遇到问题是,当键入Tab时,或者使用制表符(\t)显示文本内容时会发现,QPlainTextEdit控件中对于Tab或者制表符默认为8个空格键,而我们期望的是4个空格键。
接下来,我将展示三种不同的方法来应对前述问题:
(1)自定义Tab的宽度
QPlainTextEdit控件中包含两个对Tab属性进行设置的函数,分别是setTabStopWidth和setTabStopDistance方法,这两个方法都是设置Tab字符的宽度,单位是像素,两个函数共两个不同点:
1、setTabStopWidth方法参数是整型,setTabStopDistance方法参数为浮点型。
2、setTabStopWidth方法已经过时,建议使用setTabStopDistance函数替代。
官方文档中对此两个方法的说明如下:

下面示例函数将设置QPlainTextEdit控件的Tab字符设置为40pix。
from PyQt5.QtWidgets import QApplication, QMainWindow
from untitled import Ui_MainWindow
import sysclass MainUi(QMainWindow, Ui_MainWindow):def __init__(self):super(MainUi, self).__init__()self.setupUi(self)# self.plainTextEdit.setTabStopWidth(40)self.plainTextEdit.setTabStopDistance(40)self.plainTextEdit.setPlainText("\t1\t2\t3\t4\t5\t6\t")if __name__ == '__main__':app = QApplication(sys.argv)ui = MainUi()ui.show()sys.exit(app.exec_())
下面是程序运行后,我们可以看到Tab键使得字符之间间隔约40pix。

缺点:此方案缺点是Tab字符宽度完全为用户自定义,QPlainTextEdit控件中文本字体大小不同,Tab字符宽度是不同的,因此此方案缺乏灵活性。
(2)自动设置Tab宽度
方法(1)中的缺陷就是忽略了Tab字符的宽度应该与QPlainTextEdit中文本字体大小相一致。因此本方法在方法(1)的基础上通过获取控件中文本字体的大小,并计算4个空格的宽度进行赋值。
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtGui import QFont, QFontMetrics
from untitled import Ui_MainWindow
import sysclass MainUi(QMainWindow, Ui_MainWindow):def __init__(self):super(MainUi, self).__init__()self.setupUi(self)self.setFont(QFont("Arial", 10)) # 设置字体和大小# self.plainTextEdit.setTabStopWidth(40)# self.plainTextEdit.setTabStopDistance(40)self.plainTextEdit.setTabStopDistance(4 * self.spaceWidth())self.plainTextEdit.setPlainText("\t1\t2\t3\t4\t5\t6\t")print(self.spaceWidth())def spaceWidth(self):font_metrics = QFontMetrics(self.font())return font_metrics.width(' ') # 获取单个空格的宽度if __name__ == '__main__':app = QApplication(sys.argv)ui = MainUi()ui.show()sys.exit(app.exec_())
缺点:此方法虽然可以使Tab根据控件中文本字体大小自动计算Tab字符宽度,缺点就是我们想要的Tab为4个空格,而实际确是1个字符。
(3)自定义QPlainTextEdit控件
此方法我认为是解决Tab为4个空格最彻底的方法,虽然较上面两种方法复杂,但是效果很好。
第一步:重写QPlainTextEdit控件的keyPressEvent方法。当检测到Tab事件时替换成4个空格:
第二步:重写QPlainTextEdit控件的setPlainText方法,利用python字符串的expandtabs方法,将python字符串中\t换成指定数量的空格。
class MyPlainTextEdit(QPlainTextEdit):def __init__(self, parent=None):super(MyPlainTextEdit, self).__init__(parent)def keyPressEvent(self, event):if event.key() == Qt.Key_Tab:# 插入4个空格cursor = self.textCursor()cursor.insertText(' ')self.setTextCursor(cursor)else:super(MyPlainTextEdit, self).keyPressEvent(event)def setPlainText(self, text: str) -> None:super(MyPlainTextEdit, self).setPlainText(text.expandtabs(4))class MainUi(QMainWindow, Ui_MainWindow):def __init__(self):super(MainUi, self).__init__()self.setupUi(self)self.setWindowTitle('')self.plainTextEdit = MyPlainTextEdit()layout = QVBoxLayout()layout.addWidget(self.plainTextEdit)self.frame.setLayout(layout)self.plainTextEdit.setPlainText("\t1\t2\t3\t4\t5\t6\t")if __name__ == '__main__':app = QApplication(sys.argv)ui = MainUi()ui.show()sys.exit(app.exec_())
此方法完美解决Tab和制表符替换成4个空格符。
相关文章:
【Qt】解决设置QPlainTextEdit控件的Tab为4个空格
前言 PyQt5 是一个用于创建跨平台桌面应用程序的 Python 绑定集合,它提供了对 Qt 应用程序框架的访问。用于开发具有图形用户界面(GUI)的应用程序,以及非GUI程序。PyQt5 使得 Python 开发者可以使用 Qt 的丰富功能来构建应用程序。…...
elementUI根据列表id进行列合并@莫成尘
本文章提供了elementUI根据列表id进行列合并的demo,效果如图(可直接复制代码粘贴) <template><div id"app"><el-table border :data"tableList" style"width: 100%" :span-method"objectS…...
基于人工智能的智能安防监控系统
目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据采集与预处理模型训练与预测实时监控与检测应用场景结论 1. 引言 随着科技的发展,智能安防监控系统逐渐成为家庭、企业和公共场所保障安全的核心工具。通过人工智能和计…...
分享从零开始学习网络设备配置--任务6.3 使用基本ACL限制网络访问
任务描述 某公司构建了互联互通的办公网,为保护公司内网用户数据的安全,该公司实施内网安全防范措施。公司分为经理部、财务部和销售部,分属3个不同的网段,3个部门之间用路由器进行信息传递。为了安全起见,公司领导要求…...
数据结构——线性表(静态链表、循环链表以及双向链表)
1、静态链表 用数组描述的链表叫做静态链表,这种描述方法叫做游标实现法。 静态链表需要对数组的第一个和最后一个元素作为特殊元素处理,不存数据。 最后一个指向第一个有数据的下标地址,第一个游标指向第一个没有数据的下标地址。 我们对…...
vue3_对接腾讯_实时音视频
项目需要对接腾讯的实时音视频产品,我这里选择的是多人会议,选择其他实时音视频产品对接流程也一样,如何对接腾讯实时音视频的多人会议产品,从开通服务到对接完成,一 一讲解。 一、开通腾讯实时音视频 1.腾讯实时音视…...
一台电脑对应一个IP地址吗?探讨两台电脑共用IP的可能性
在当今数字化时代,IP地址作为网络世界中的“门牌号”,扮演着至关重要的角色。它负责在网络上唯一标识每一台设备,使得数据能够在庞大的互联网中准确无误地传输。然而,对于IP地址与电脑之间的对应关系,许…...
XInput手柄输入封装
功能全面地封装了XInput的输入, 1. 普通按钮按下, 按住, 弹起状态检查, 2. 摇杆4个方向的按下, 按住, 弹起检查 3. 按键状态变化检测并且记录按下触发时间, 按住保持时间, 方便用来完全自定义的输入功能 4. 多手柄输入合并 CXinputHelper.h #pragma once #include <win…...
NodeMCU-ESP8266+flash_download_tool_3.9.7 烧录
USB-TTL 接 NodeMCU的RXD0, TXD0, GND 例程hello_world: Eclipse编译信息: python /d/ESP/ESP8266_RTOS_SDK/ESP8266_RTOS_SDK/components/esptool_py/esptool/esptool.py --chip esp8266 --port COM6 --baud 115200 --before default_reset --after …...
首例开源的自动驾驶混合运动规划框架,手握“规划可解释”和“决策准确”两张王牌!
导读: 本文开发了一种新的混合运动规划方法,将环境和预测信息集成在Frenet坐标系中,提升了运动规划能力。本文将传统运动规划算法的可预测性和稳定性与RL的动态适应性相结合,从而形成了一个能够有效管理复杂情况并适应不断变化的环…...
数据结构之红黑树的 “奥秘“
目录: 一.红黑树概念 二. 红黑树的性质 三.红黑树的实现 四.红黑树验证 五.AVL树和红黑树的比较 一.红黑树概念 1.红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何 一条从根…...
【鸿蒙 HarmonyOS NEXT】使用EventHub进行数据通信
✨本人自己开发的开源项目:土拨鼠充电系统 ✨踩坑不易,还希望各位大佬支持一下,在GitHub给我点个 Start ⭐⭐👍👍 ✍GitHub开源项目地址👉:https://github.com/cheinlu/groundhog-charging-syst…...
大模型RAG实战|构建知识库:文档和网页的加载、转换、索引与存储
我们要开发一个生产级的系统,还需要对LlamaIndex的各个组件和技术进行深度的理解、运用和调优。本系列将会聚焦在如何让系统实用上,包括:知识库的管理,检索和查询效果的提升,使用本地化部署的模型等主题。我将会讲解相…...
江协科技stm32————11-5 硬件SPI读写W25Q64
一、开启时钟,开启SPI和GPIO的时钟 二、初始化GPIO口,其中SCK和MOSI是由硬件外设控制的输出信号,配置为复用推挽输出 MISO是硬件外设的输入信号,配置为上拉输入,SS是软件控制的输出信号,配置为通用推挽输出…...
网络编程day04(UDP、Linux IO 模型)
目录 【1】UDP 1》通信流程 2》函数接口 1> recvfrom 2> sendto 3》代码展示 1> 服务器代码 2> 客户端代码 【2】Linux IO 模型 场景假设一 1》阻塞式IO:最常见、效率低、不耗费CPU 2》 非阻塞 IO:轮询、耗费CPU,可以处…...
【android10】【binder】【2.servicemanager启动——全源码分析】
系列文章目录 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录 …...
Java实现简易计算器功能(idea)
目的:写一个计算器,要求实现加减乘除功能,并且能够循环接收新的数据,通过用户交互实现。 思路: (1)写4个方法:加减乘除 (2)利用循环switch进行用户交互 &…...
Parsec问题解决方案
Parsec目前就是被墙了,有解决方案但治标不治本,如果想稳定串流建议是更换稳定的串流软件,以下是一些解决方案 方案一:在%appdata%/Parsec/config.txt中,添加代理 app_proxy_address 127.0.0.1 app_proxy_scheme http…...
Swift 创建扩展(Extension)
类别(Category) 和 扩展(Extension) 的 用法很多. 常用的 扩展(Extension) 有分离代码和封装模块的功能,例如登陆页面有注册功能,有登陆功能,有找回密码功能,都写在一个页面就太冗余了,可以考虑使用 扩展(Extension) 登陆页面的方法来分离代码 本文介绍Swift 如何创建扩展(Ex…...
九月五日(k8s配置)
一、安装环境 环境准备:(有阿里云) k8s-master 192.168.1.11 k8s-node1 192.168.1.22 k8s-node2 192.168.1.33 二、前期准备 在k8s-master主机 [rootk8s-master ~]# vim /etc/hosts …...
效率提升:基于快马平台为dc=y103pc=类参数快速打造调试工具
效率提升:基于快马平台为dcy103&pc类参数快速打造调试工具 在日常开发中,我们经常需要处理各种URL参数,尤其是类似"dcy103&pctest"这样的查询字符串。手动解析和修改这些参数不仅效率低下,还容易出错。最近我在…...
103. ancher WebSocket 与 NGINX OSS 入口控制器的故障
Environment 环境 SUSE Rancher 2.10.3AWS EKS cluster AWS EKS 集群NGINX OSS Ingress Controller (oci://ghcr.io/nginx/charts/nginx-ingress) NGINX OSS 入口控制器(oci:// ghcr.io/nginx/charts/nginx-ingress) Situation 地理位置 After upgrad…...
如何快速清理Windows 11臃肿:Win11Debloat完整优化指南
如何快速清理Windows 11臃肿:Win11Debloat完整优化指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and c…...
Transformer 从0到1:注意力机制的数学形式——Query, Key, Value 三元组
# Transformer 从0到1:注意力机制的数学形式——Query, Key, Value 三元组## 1. 引言:从序列建模的困境到注意力机制的诞生在深度学习的发展历程中,处理序列数据(如文本、音频、时间序列)一直是核心挑战之一。早期的循…...
告别预烘焙!在UE材质编辑器中实时生成FlowMap和法线贴图(附节点图)
实时材质魔法:UE引擎中FlowMap与法线贴图的动态生成技术 在游戏开发与动态视觉创作领域,材质表现的真实感与动态效果一直是技术美术师们追求的核心目标。传统工作流中,FlowMap(流场图)和法线贴图的生成往往依赖于外部软…...
第一次降AIGC率不知道从哪入手?这份保姆级操作手册帮你
第一次操作的话,照着下面的步骤来,15分钟内搞定降AIGC率、降AI工具保姆级测评2026、降AI。 工具选嘎嘎降AI(www.aigcleaner.com),达标率99.26%,有退款保障,操作也不复杂。 准备工作 需要准备的…...
构建Pixel Couplet Gen的微信小程序:让AI春联触手可及
构建Pixel Couplet Gen的微信小程序:让AI春联触手可及 1. 项目背景与价值 春节贴春联是中国传统文化的重要组成部分,但现代人往往缺乏时间和书法技能来创作个性化春联。Pixel Couplet Gen作为一款AI春联生成模型,能够根据用户输入自动生成像…...
2025届学术党必备的十大降重复率神器推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 于学术研究范畴之内,论文撰写常常会由于其结构繁杂且格式规范极为严格࿰…...
MaxKB:企业级AI知识库部署实战指南
MaxKB:企业级AI知识库部署实战指南 【免费下载链接】MaxKB 🔥 MaxKB is an open-source platform for building enterprise-grade agents. 强大易用的开源企业级智能体平台。 项目地址: https://gitcode.com/GitHub_Trending/ma/MaxKB 面对企业AI…...
宝可梦随机化终极指南:Universal Pokemon Randomizer ZX 完全使用教程
宝可梦随机化终极指南:Universal Pokemon Randomizer ZX 完全使用教程 【免费下载链接】universal-pokemon-randomizer-zx Public repository of source code for the Universal Pokemon Randomizer ZX 项目地址: https://gitcode.com/gh_mirrors/un/universal-po…...
