首页 > 其他分享 >【Qt】解决设置QPlainTextEdit控件的Tab为4个空格

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

时间:2024-09-09 19:21:22浏览次数:10  
标签:__ 控件 Qt self plainTextEdit Tab QPlainTextEdit

前言

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

标签:__,控件,Qt,self,plainTextEdit,Tab,QPlainTextEdit
From: https://blog.csdn.net/qq_29490749/article/details/142066130

相关文章

  • 【Qt】信号和槽
    目录......
  • 河南省12123公安厅临牌打印如何下载打印控件
    公安交通管理综合应用平台打印控件安装失败,河南省公安厅临牌打印如何下载打印控件,12123临牌系统怎么安装打印控件?   关于“12123河南省公安厅临牌打印如何下载打印控件怎么安装打印控件”的问题,实际上,交管12123APP主要用于在线申请临时号牌、查询车辆信息、处理交通违......
  • Qt/C++ 音视频开发: 使用 mpv 进行录像存储
    Qt/C++音视频开发:使用mpv进行录像存储介绍在现代应用中,音视频处理与存储是非常常见的需求。mpv是一个开源的视频播放器,具有强大的功能,可以通过其API进行定制化开发。本文将详细介绍如何使用Qt/C++和mpv实现录像存储功能。应用使用场景视频监控系统:实时采集......
  • 计算机毕业设计python企业人事员工考勤管理系统 8bqti
    目录技术栈和环境说明具体实现截图系统设计技术路线解决的思路python-flask核心代码部分展示python-django核心代码部分展示django项目结构讲解研究方法研究目的可行性分析论证源码获取技术栈和环境说明本系统以Python开发语言开发,MySQL为后台数据库,采用DJANGO/flas......
  • Qt:自制白噪声播放器
    前言由于本人觉得听着白噪声学习效果才会更佳,所以做了一个白噪声播放器。先看效果吧我在里面添加了一些音乐运行视频whiteMusicDemo中间区域原本想画个图像的,但是不知道要画啥,就搞了张图片贴上去,如果有想法的朋友可以评论区留言,如果我能力足够我会画上去。正文......
  • 嵌入式QT开发:构建高效智能的嵌入式系统
    摘要: 本文深入探讨了嵌入式QT相关的各个方面。从QT框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式QT的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式QT的界面设计与开发,涵盖了从基本控件的使用到......
  • 在 Qt5 中创建一个 HTTP 接口以返回屏幕截图
    在Qt5中创建一个HTTP接口以返回MainWindow的屏幕截图在Qt5中,可以通过使用QTcpServer和QTcpSocket来创建一个简单的HTTP服务器。通过这种方式,我们可以实现一个HTTP接口,当访问该接口时,会返回当前MainWindow窗口的屏幕截图。以下是实现这一功能的详细步骤与相关知......
  • PyQt6/PySide6:账本项目前端制作【附完整项目地址】
    0.前言最近在家里闲着没事,正好又看到朋友@studentWheat发了篇用Tkinter做的账本,于是决定跟他一起改进这个程序。屏幕截图:1.后端后端主要是朋友做的,在这里就不多说了,放个代码:src/api.pyfromcollectionsimportdefaultdictclassApiError(RuntimeError):passd......
  • Qt 自动连接机制信号与槽
    概述Qt提供了自动连接机制,可以根据特定的命名规则自动将信号与槽连接。这种机制简化了信号与槽的连接工作,无需显式地调用QObject::connect。命名规则自动连接机制依赖于特定的槽函数命名规则。槽函数名称的格式为:on_<objectName>_<signalName>objectName:是发射信号的对象......
  • 【Qt】窗口移动和大小改变事件
     窗口移动和大小改变事件moveEvent窗口移动时触发的事件resizeEvent窗口大小改变时触发的事件例子:测试移动窗口和改变窗口事件 代码展示#include"widget.h"#include"ui_widget.h"#include<QDebug>#include<QMoveEvent>#include<QResizeEvent>Widget::Wi......