获取QTextEdit选择的边界框

2023-12-09

我试图获取存储在列表中的一系列文本选择的边界框。边界框是可以包含整个选择的最小矩形。列表中的每个项目都有一个起始点和结束点,以字符数为单位从起始点开始计算QTextEdit窗口和字母标识符。QTextEdit.cursorRect(cursor)应该这样做,但会产生无意义的盒子尺寸:

id: A -- PySide.QtCore.QRect(0, 0, 1, 10)
id: B -- PySide.QtCore.QRect(0, 0, 1, 10)
id: C -- PySide.QtCore.QRect(0, 0, 1, 10)

所有选择都从不同的点开始,因此 (0,0) 在视点坐标中不正确。此外,其中一些跨越多行,因此宽度和高度应该有所不同。问题可能是光标处于循环中并且我没有设置它setTextCursor直到循环结束后。我这样做是因为我还将选择呈现为突出显示。我怎样才能得到cursorRect正确工作或以其他方式为每个选择获得单独的边界框?这是代码:

import sys
from PySide.QtCore import *
from PySide.QtGui import *

db = ((5,8,'A'),(20,35,'B'),(45,60,'C')) # start, end, and identifier of highlights

class TextEditor(QTextEdit):

    def __init__(self, parent=None):
        super().__init__(parent)
        text="This is example text that is several lines\nlong and also\nstrangely broken up and can be\nwrapped."
        self.setText(text)
        for n in range(0,len(db)):
            row = db[n]
            startChar = row[0]
            endChar = row[1]
            id = row[2]

            cursor = self.textCursor()
            cursor.setPosition(startChar)
            cursor.movePosition(QTextCursor.NextCharacter, QTextCursor.KeepAnchor, endChar-startChar)

            rect = self.cursorRect(cursor)
            print("id: %s -- %s" % (id,str(rect)))

            charfmt = cursor.charFormat()
            charfmt.setBackground(QColor(Qt.yellow))
            cursor.setCharFormat(charfmt)
        cursor.clearSelection()
        self.setTextCursor(cursor)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    editor = TextEditor()
    editor.show()
    app.exec_()
    sys.exit(app.exec_())

EDIT 1:

这是该程序的文本。我将使用大写字母来突出显示文本:

This IS example text THAT IS SEVERAL lines
loNG AND ALSO
STRangely broken up and can be
wrapped.

假设每个字符都是 10 像素 x 10 像素。 “IS ”从 5 个字符开始,并延伸 3 个字符(包括末尾的空格)。因此,“I”的左上角将位于 x=50,y=0 处。空间的右下角位于 x=80,y=10 处。如果边界矩形以坐标给出,则为 (50,0,80,10)。如果边界矩形以起始坐标和大小给出,则为 (50,0,30,10)。

第二行是一个亮点,一直延续到第三行。它最左边的字符是第 3 行开头的“S”,即 x=0 处。它最右边的字符是“ALSO”中的“O”,以 x=130 结尾。它的最上面一行是第二行,从 y=10 开始。它的最底下一行是第三行,结束于 y=30。因此,边界框的坐标为 (0,10,130,30),起点和大小为 (0,10,130,20)。


下面是为数据库中的信息指定的所有突出显示部分查找边界框的第一次努力。为了清楚地表明每个边界框涵盖的内容,示例脚本显示了相应的橡皮筋。结果如下:

enter image description here

调整窗口大小将根据当前自动换行自动重新计算框。请注意,如果窗口变得非常小,这可能意味着多个框会相互重叠。

我已将此作为单独的方法实现,因为对字符格式的更改可能会重新设置文档布局。因此,在第二遍中计算框更加可靠。当然,这也允许在调整窗口大小时动态重新计算。

import sys
from PySide.QtCore import *
from PySide.QtGui import *

db = ((5,8,'A'),(20,35,'B'),(45,60,'C')) # start, end, and identifier of highlights

class TextEditor(QTextEdit):
    def __init__(self, parent=None):
        super().__init__(parent)
        text="This is example text that is several lines\nlong and also\nstrangely broken up and can be\nwrapped."
        self.setText(text)
        cursor = self.textCursor()
        for n in range(0,len(db)):
            row = db[n]
            startChar = row[0]
            endChar = row[1]
            id = row[2]
            cursor.setPosition(startChar)
            cursor.movePosition(QTextCursor.NextCharacter, QTextCursor.KeepAnchor, endChar-startChar)
            charfmt = cursor.charFormat()
            charfmt.setBackground(QColor(Qt.yellow))
            cursor.setCharFormat(charfmt)
        cursor.clearSelection()
        self.setTextCursor(cursor)

    def getBoundingRect(self, start, end):
        cursor = self.textCursor()
        cursor.setPosition(end)
        last_rect = end_rect = self.cursorRect(cursor)
        cursor.setPosition(start)
        first_rect = start_rect = self.cursorRect(cursor)
        if start_rect.y() != end_rect.y():
            cursor.movePosition(QTextCursor.StartOfLine)
            first_rect = last_rect = self.cursorRect(cursor)
            while True:
                cursor.movePosition(QTextCursor.EndOfLine)
                rect = self.cursorRect(cursor)
                if rect.y() < end_rect.y() and rect.x() > last_rect.x():
                    last_rect = rect
                moved = cursor.movePosition(QTextCursor.NextCharacter)
                if not moved or rect.y() > end_rect.y():
                    break
            last_rect = last_rect.united(end_rect)
        return first_rect.united(last_rect)

class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.edit = TextEditor(self)
        layout = QVBoxLayout(self)
        layout.addWidget(self.edit)
        self.boxes = []

    def showBoxes(self):
        while self.boxes:
            self.boxes.pop().deleteLater()
        viewport = self.edit.viewport()
        for start, end, ident in db:
            rect = self.edit.getBoundingRect(start, end)
            box = QRubberBand(QRubberBand.Rectangle, viewport)
            box.setGeometry(rect)
            box.show()
            self.boxes.append(box)

    def resizeEvent(self, event):
        self.showBoxes()
        super().resizeEvent(event)

if __name__ == '__main__':

    app = QApplication(sys.argv)
    window = Window()
    window.setGeometry(800, 100, 350, 150)
    window.show()
    window.showBoxes()
    sys.exit(app.exec_())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取QTextEdit选择的边界框 的相关文章

  • (discord.py) 尝试更改成员角色时,“用户”对象没有属性“角色”

    因此 我正在尝试编写一个机器人 让某人在命令中指定的主持人指定的一段时间内暂停角色 我知道该变量称为 小时 即使它目前以秒为单位 我稍后会解决这个问题 基本上 它是由主持人在消息 暂停 personmention numberofhours
  • Python、Tkinter、更改标签颜色

    有没有一种简单的方法来更改按钮中文本的颜色 I use button text input text here 更改按下后按钮文本的内容 是否存在类似的颜色变化 button color red Use the foreground设置按钮
  • 如何等到 Excel 计算公式后再继续 win32com

    我有一个 win32com Python 脚本 它将多个 Excel 文件合并到电子表格中并将其另存为 PDF 现在的工作原理是输出几乎都是 NAME 因为文件是在计算 Excel 文件内容之前输出的 这可能需要一分钟 如何强制工作簿计算值
  • SQL Alchemy 中的 NULL 安全不等式比较?

    目前 我知道如何表达 NULL 安全的唯一方法 SQL Alchemy 中的比较 其中与 NULL 条目的比较计算结果为 True 而不是 NULL 是 or field None field value 有没有办法在 SQL Alchem
  • Spark的distinct()函数是否仅对每个分区中的不同元组进行洗牌

    据我了解 distinct 哈希分区 RDD 来识别唯一键 但它是否针对仅移动每个分区的不同元组进行了优化 想象一个具有以下分区的 RDD 1 2 2 1 4 2 2 1 3 3 5 4 5 5 5 在此 RDD 上的不同键上 所有重复键
  • Python tcl 未正确安装

    我刚刚为 python 安装了graphics py 但是当我尝试运行以下代码时 from graphics import def main win GraphWin My Circle 100 100 c Circle Point 50
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • Python 中的二进制缓冲区

    在Python中你可以使用StringIO https docs python org library struct html用于字符数据的类似文件的缓冲区 内存映射文件 https docs python org library mmap
  • Pandas Dataframe 中 bool 值的条件前向填充

    问题 如何转发 fill boolTruepandas 数据框中的值 如果是当天的第一个条目 True 到一天结束时 请参阅以下示例和所需的输出 Data import pandas as pd import numpy as np df
  • 当玩家触摸屏幕一侧时,如何让 pygame 发出警告?

    我使用 pygame 创建了一个游戏 当玩家触摸屏幕一侧时 我想让 pygame 给出类似 你不能触摸屏幕两侧 的错误 我尝试在互联网上搜索 但没有找到任何好的结果 我想过在屏幕外添加一个方块 当玩家触摸该方块时 它会发出警告 但这花了很长
  • 表达式中的 Python 'in' 关键字与 for 循环中的比较 [重复]

    这个问题在这里已经有答案了 我明白什么是in运算符在此代码中执行的操作 some list 1 2 3 4 5 print 2 in some list 我也明白i将采用此代码中列表的每个值 for i in 1 2 3 4 5 print
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • 如何将 PIL 图像转换为 NumPy 数组?

    如何转换 PILImage来回转换为 NumPy 数组 这样我就可以比 PIL 进行更快的像素级转换PixelAccess允许 我可以通过以下方式将其转换为 NumPy 数组 pic Image open foo jpg pix numpy
  • 为美国东部以外地区的 Cloudwatch 警报发送短信?

    AWS 似乎没有为美国东部以外的 SNS 主题订阅者提供 SMS 作为协议 我想连接我的 CloudWatch 警报并在发生故障时接收短信 但无法将其发送到 SMS YES 经过一番挖掘后 我能够让它发挥作用 它比仅仅选择一个主题或输入闹钟
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • 您可以在 Python 类型注释中指定方差吗?

    你能发现下面代码中的错误吗 米皮不能 from typing import Dict Any def add items d Dict str Any gt None d foo 5 d Dict str str add items d f

随机推荐

  • 在 MATLAB 中调整图像大小

    我正在尝试创建一个函数 根据家庭作业的值 scale zoom 缩放图像 我不想使用 MATLAB 内置函数resize 在此函数中 所以我尝试进行插值 任何帮助将不胜感激 这是我到目前为止所拥有的 function pic new sca
  • TCL 脚本:变量作为函数的参数

    我正在尝试使用 Amira 进行一些简单的脚本编写 它使用 TCL 但我不能保证它是标准版本 我想从一个对象读取属性并将其分配给另一个对象 在命令窗口中 过程如下 Image1 获取变换 0 1 0 2 0 3 0 0 0 0 0 0 1
  • liquibase 使用 Maven 和两个数据库

    我有以下结构来从 Maven 运行一个数据库
  • PHP 互斥(mutex)

    阅读一些有关 PHP 中锁定的文本 它们主要都是针对http php net manual en function flock php 本页讨论在硬盘上打开文件 真的是这样吗 我的意思是 这使得锁定非常昂贵 这意味着每次我想要锁定时我都必须
  • android 通过显式 TLS 进行 ftp 文件传输

    我在一遍又一遍地尝试让它工作但没有成功后发布这个问题 我尝试使用 apache commons 库在 android 中实现 FTP 文件传输 通信必须通过显式 TLS 身份验证完成 我可以成功登录 连接到服务器并列出文件 但每当我尝试获取
  • 如何在字符串中的字符串周围加粗两个单词,但不重叠句子?

    我需要将搜索词及其上下文 在句子中 加粗 考虑字符串 Lorem ipsum dolor 坐 amet 连接脂肪精英 如果搜索词是Lorem ipsum 那么结果应该是 Lorem ipsum dolor 坐阿梅特 连接脂肪精英 如果搜索是
  • C 中的 sizeof() 函数 [重复]

    这个问题在这里已经有答案了 main char a Visual C char b Visual C printf n d d sizeof a sizeof b printf n d d sizeof a sizeof b sizeof
  • C 库函数 fflush(stdin) 的替代方案

    谁能解释一下下面的代码是如何解释的 我真的不明白 while c getchar n c EOF 我知道它用于刷新输入流并且可以用标准 C 库函数替换 fflush stdin while c getchar n c EOF 这会读取输入字
  • AADSTS50020:租户中不存在用户帐户

    我能够将另一个租户创建的应用程序注册为我自己租户的企业应用程序 我以用户身份登录该应用程序 但收到以下错误 AADSTS50020 用户帐户 电子邮件受保护 来自身份提供商 https sts windows net aaaaaaaa bb
  • 如何将 std::string 转换为 double

    通常 当我用 C 编写任何内容时 我需要将char进入一个int我只是做了一个新的int等于字符 我使用了代码 片段 string word openfile gt gt word double lol word 我收到的错误是 Code1
  • 如何正确地将数据保存到数据库中?

    我通常将新数据保存到数据库中 如下所示 this gt MyTable gt set array id gt id code gt temp code status gt status age gt age location gt loca
  • 如何使用 iTextSharp 转换为 PDF

    ASP
  • 从 Parse.com 检索 PFFile 时“在解包可选值时意外发现 nil”

    当我检索 Parse com 中存储的 PFFile 时遇到问题 let user PFUser currentUser let userImageFile user profileImage as PFFile userImageFile
  • MQQueueManager消息池

    我过去使用 RabbitMq 作为 MessageQueue 当收到消息时触发事件非常简单 我查看了 IBM 安装程序提供的 NET 源代码 但发现处理它的方法不太好 查看示例 SimpleSubscribe 它做了这样的事情来池化 get
  • 如何维护数据库结构的修订控制?

    跟踪项目数据库结构更改的最简单方法是什么 当我更改数据库的某些内容 例如 添加新表 向现有表添加新字段 添加索引等 时 我希望将其传播到团队的其他成员 并最终传播到生产服务器 最小的麻烦和努力 目前 解决方案相当薄弱 并且依赖于人们记住做事
  • 为什么 TypeScript 无法从过滤数组推断类型?

    下面是一些示例代码 TypeScript 推断类型validStudents as Students 对于任何阅读代码的人来说 显而易见的是 因为所有无效记录都被过滤掉了 validStudents可以安全地被认为具有某种类型ValidSt
  • 递归执行广度优先搜索

    假设您想实现二叉树的广度优先搜索递归地 你会怎样做呢 是否可以仅使用调用堆栈作为辅助存储 我假设这只是某种思维练习 甚至是一个技巧作业 面试问题 但我想我可以想象一些奇怪的场景 由于某种原因你不允许任何堆空间 一些非常糟糕的习惯 内存管理器
  • 在VBA中修改现有的excel连接名称

    我需要更新 Excel 工作簿的 SQL 连接的连接名称 这是我的尝试 我已经能够通过执行标准替换来修改连接字符串和命令文本 Sub ConnectionString modify Dim i As Long Dim cnt As Long
  • 我想使用 .htaccess 从网址中删除问号和 .php 扩展名

    我在 htaccess 中遇到重定向 URL 问题 我想从 URL 中删除 php 和问号 例如 www example com test php id 12 to www example com test 12需要这样的格式 我尝试在我的
  • 获取QTextEdit选择的边界框

    我试图获取存储在列表中的一系列文本选择的边界框 边界框是可以包含整个选择的最小矩形 列表中的每个项目都有一个起始点和结束点 以字符数为单位从起始点开始计算QTextEdit窗口和字母标识符 QTextEdit cursorRect curs