当前位置: 首页 > news >正文

【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属性进行设置的函数,分别是setTabStopWidthsetTabStopDistance方法,这两个方法都是设置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个空格符。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C与汇编之间的相互调用(29)
  • ArcGIS之建模处理栅格数据以表格显示分区统计(以夜间灯光数据为例)
  • C# 基础巩固 详解 匿名方法、lambda表达式和Action关键字
  • 如何在算家云搭建MindSearch(智能搜索)
  • 2024数学建模国赛B题代码
  • 探索非局部均值滤波在椒盐噪声去除中的应用
  • C# 删除Word文档中的段落
  • uniapp写的一个年月日时分秒时间选择功能
  • Linux-进程管理【重点】
  • elementUI之不会用
  • 《C Primer Plus》第 11 章复习题和编程练习
  • STM32 RTC实时时钟
  • 如何看待IBM中国研发部裁员!
  • 惩罚矩阵?动态规划是如何爱上矩阵的
  • rman 备份尽量使用 backup database plus archivelog
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 《Java编程思想》读书笔记-对象导论
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • angular组件开发
  • classpath对获取配置文件的影响
  • CSS居中完全指南——构建CSS居中决策树
  • css系列之关于字体的事
  • Java,console输出实时的转向GUI textbox
  • JavaScript的使用你知道几种?(上)
  • JavaScript学习总结——原型
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • leetcode388. Longest Absolute File Path
  • mac修复ab及siege安装
  • MD5加密原理解析及OC版原理实现
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Sass 快速入门教程
  • 构造函数(constructor)与原型链(prototype)关系
  • 后端_ThinkPHP5
  • 简单实现一个textarea自适应高度
  • 前嗅ForeSpider教程:创建模板
  • Hibernate主键生成策略及选择
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 容器镜像
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • # Redis 入门到精通(七)-- redis 删除策略
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (21)起落架/可伸缩相机支架
  • (3)llvm ir转换过程
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (6)设计一个TimeMap
  • (6)添加vue-cookie
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424