【Qt】解决设置QPlainTextEdit控件的Tab为4个空格

news2024/11/17 5:53:05

前言

PyQt5 是一个用于创建跨平台桌面应用程序的 Python 绑定集合,它提供了对 Qt 应用程序框架的访问。用于开发具有图形用户界面(GUI)的应用程序,以及非GUI程序。PyQt5 使得 Python 开发者可以使用 Qt 的丰富功能来构建应用程序。QPlainTextEdit 是 Qt 框架中的一个纯文本编辑器控件,它提供了一个高级的文本编辑和显示功能,专门用于处理纯文本数据。

使用QPlainTextEdit可作为文本显示控件,支持显示与编辑的功能,但是在编辑过程中遇到问题是,当键入Tab时,或者使用制表符(\t)显示文本内容时会发现,QPlainTextEdit控件中对于Tab或者制表符默认为8个空格键,而我们期望的是4个空格键。

接下来,我将展示三种不同的方法来应对前述问题:

(1)自定义Tab的宽度

QPlainTextEdit控件中包含两个对Tab属性进行设置的函数,分别是setTabStopWidthsetTabStopDistance方法,这两个方法都是设置Tab字符的宽度,单位是像素,两个函数共两个不同点:

1、setTabStopWidth方法参数是整型,setTabStopDistance方法参数为浮点型。

2、setTabStopWidth方法已经过时,建议使用setTabStopDistance函数替代。

官方文档中对此两个方法的说明如下:

      下面示例函数将设置QPlainTextEdit控件的Tab字符设置为40pix。

from PyQt5.QtWidgets import QApplication, QMainWindow
from untitled import Ui_MainWindow
import sys


class 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 sys


class 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个空格符。

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

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

相关文章

【无线通信发展史⑨】1791年路易吉·伽伐尼-关于动物电的研究与1800年亚历山大·伏打伯爵-电池:伏打电池

前言:用这几个问答形式来解读下我这个系列的来龙去脉。如果大家觉得本篇文章不水的话希望帮忙点赞收藏加关注,你们的鼓舞是我继续更新的动力。 我为什么会写这个系列呢? 首先肯定是因为我本身就是一名从业通信者,想着更加了解自己…

RHEL 7 安装配置( Linux 网络操作系统 02)

一、虚拟机安装 我们的每台电脑都已经安装了VMware 虚拟机,其安装相当简单,在此不再赘述。可以参考如下链接: VMWare安装傻瓜式教程 (大家可以关注老师的博客,也建议大家写博客。) 二、红帽 rhel 7 安装 找…

Windows系统Docker部署AList并挂载阿里云盘实现远程访问详细教程——“cpolar内网穿透”

文章目录 前言1. 使用Docker本地部署Alist1.1 本地部署 Alist1.2 访问并设置Alist1.3 在管理界面添加存储 2. 安装cpolar内网穿透3. 固定Alist公网地址 前言 本文和大家分享如何在Windows系统使用Docker本地部署Alist全平台网盘神器,然后结合cpolar内网穿透工具实现…

运维Tips | 如何安全的移除系统中旧的Linux内核?

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 如何安全的删除系统中旧的 Linux 内核? 描述:如果更新了 Linux 操作系统,那么你会注意到,每次升级 Linux 内核后,GRUB 菜单都会添加一个新的引导条…

如何解决 Windows PowerShell 中 “无法加载文件 pnpm.ps1” 的错误

当你在 Windows 系统上尝试使用 pnpm 时,如果遇到“无法加载文件 pnpm.ps1”的错误,通常这意味着 PowerShell 的执行策略阻止了脚本的运行。这种限制是为了防止未经授权的脚本在您的计算机上执行,但它同样也会阻止合法但未签名的脚本运行。 …

解读:靠卖石头能否实现财务自由?

在生活中,我们常常听闻各种独特的创业故事,而 “卖石头实现月入过万” 也成为了一个令人好奇的话题。 在大家生活压力都比较大的情况下,许多人都在寻找新的收入来源,尤其是在经济压力日益增加的情况下。最近,一些人开…

如何选择可靠的相亲交友平台:安全与诚信并重

在数字化时代,相亲交友系统已成为寻找伴侣的重要途径。然而,选择一个可靠的平台对于确保安全和诚信至关重要。以下是如何选择可靠相亲交友平台的指南 : 第一章:安全为先 选择相亲交友系统时,安全性是首要考虑的因素。…

读书记录:谷歌工作法 工作效率提升10倍的57个技巧

​ 前言 我在谷歌工作时留下的最深刻印象是“必须以全世界最快的速度取得成果”这一谷歌特有的强烈的使命感。 为什么日本的企业生产效率低下 过度推迟讨论 过分讨论 过度的交流 改变工作方式方法才是生存之道 在这样的时代,我们不应该害怕“自己的工作消失”&a…

【CSS in Depth 2 精译_027】4.4 Flexbox 元素对齐、间距等细节处理(下)+ 4.5 本章小结

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对…

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 &#x1f4bb…

【拥抱AI】主流平台AI Agent使用体验对比

为了更好的了解和学习RAG的原理和实战效果,也因为工作需要,这两天都奔波在各大主流AI平台。 以下自己收集的是一些主流大模型LLM的AI Agent对比,通过功能特性、易用性与集成性、成本与商业模式、安全性与隐私性几个方面来了解,有不…

LSP协议:打造流动性管理的市场新标杆

随着以太坊从 PoW(工作量证明)向 PoS(权益证明)的转型,PoS已然成为主流区块链共识机制的重要组成部分。再加上跨链技术的发展,包含比特币在内的不同生态之间进行资产质押与交换也催生出市场对于流动性管理的…

CentOS Stream 8中安装和使用 Docker

docker安装包-CSDN博客 〇、常用的docker命令 docker的作用: 快速进行软件的安装,便于软件环境的维护 docker的镜像: 压缩了指定软件的安装包的文件。使用镜像文件创建容器 docker的容器: 容器可以理解为就是一台小电脑。安装的linux系统&am…

《OpenCV计算机视觉》—— 对图片进行旋转的两种方法

文章目录 一、用numpy库中的方法对图片进行旋转二、用OpenCV库中的方法对图片进行旋转 一、用numpy库中的方法对图片进行旋转 numpy库中的 np.rot90 函数方法可以对图片进行旋转 代码实现如下: import cv2 import numpy as np# 读取图片 img cv2.imread(wechat.jp…

[基金理财] 投资组合的搭建

📢博客主页:https://loewen.blog.csdn.net📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉📢现…

(CVPR-2023)面向实用的即插即用扩散模型

面向实用的即插即用扩散模型 Paper Title:Towards Practical Plug-and-Play Diffusion Models Paper是Riiid AI Research发表在CVPR 2023的工作 paper地址 Code地址 Abstract 基于扩散的生成模型在图像生成方面取得了显著的成功。它们的指导公式允许外部模型即插即…

PX4软/硬件(SITL/HITL)在环仿真

文章目录 介绍依赖PX4 Firmware: 软件在环(SITL)仿真Gazebo 软件无人机STIL连接简要示意SITL SLAM仿真总结示例 HITL 仿真 pxh常用命令MAVLink 指令使用这些命令时的注意事项 参考链接 介绍 为https://blog.csdn.net/weixin_41469272/article/details/117919845的补…

【买卖股票系列问题 -- 动规 + 其他转换方法】

目录: 前言买卖股票的最佳时机题解1:找出最值区间题解2:问题转化:最大子序和题解3:动态规划 买卖股票的最佳时机 II题解1:动态规划题解2:贪心 买卖股票的最佳时机含冷冻期动态规划 买卖股票的最…

Java代码审计篇 | ofcms系统审计思路讲解 - 篇1 | 环境搭建、路由机制

文章目录 Java代码审计篇 | ofcms系统审计思路讲解 - 篇1 | 环境搭建、路由机制1. 前言2. 项目环境搭建3. 项目路由机制3.1. 1)先搜索pom.xml文件,看看使用了什么框架3.2. 2)确定是否是spring的路由机制3.3. 3)确定自写路由机制的…

双指针(7)_单调性_三数之和

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 双指针(7)_单调性_三数之和 收录于专栏【经典算法练习】 本专栏旨在分享学习C的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. 题目…