PyQt/PySide中QPdfView子类化以支持交互式矩形绘制教程

PyQt/PySide中QPdfView子类化以支持交互式矩形绘制教程

本教程详细介绍了如何通过子类化QPdfView组件,实现在PDF文档视图上交互式绘制矩形的功能。文章涵盖了鼠标事件处理、绘图状态管理以及paintEvent的正确使用,并着重阐明了使用self.viewport().repaint()来确保绘制内容即时更新到PDF视图的关键技巧,从而解决在QPdfView上进行自定义绘图时常见的刷新问题。

在许多需要对pdf文档进行标注或编辑的应用程序中,能够在pdf视图上直接绘制图形是一项基本需求。qt框架提供了qpdfview用于显示pdf文档,但其本身并不直接支持交互式绘图。为了实现这一功能,我们需要对其进行子类化,并结合qt的事件处理机制和绘图api。

理解QPdfView的绘图机制与挑战

QPdfView在内部使用一个视口(viewport)来渲染PDF内容。当我们尝试在其上进行自定义绘图时,通常会重写paintEvent方法。然而,直接调用self.update()(它会触发self.paintEvent)可能不会立即在PDF内容上显示我们绘制的图形,因为QPdfView的绘图区域可能被其内部的PDF渲染机制所覆盖,或者self.update()未能正确地通知其内部视口进行重绘。解决此问题的关键在于直接操作QPdfView的视口进行重绘。

实现交互式矩形绘制

我们将通过子类化QPdfView来实现一个名为CustomQPdfView的组件,它能够响应鼠标事件来绘制和调整矩形。

1. 定义绘图状态

为了管理矩形的绘制和编辑过程,我们需要定义几种状态:

# 定义绘图状态常量FREE_STATE = 1        # 自由状态,未进行任何绘图操作BUILDING_SQUARE = 2   # 正在绘制矩形BEGIN_SIDE_EDIT = 3   # 正在编辑矩形的起始边(通常是左边)END_SIDE_EDIT = 4     # 正在编辑矩形的结束边(通常是右边)

2. 初始化CustomQPdfView

在CustomQPdfView的构造函数中,我们需要初始化绘制矩形的起始点和结束点,以及当前的绘图状态。同时,可以设置绘制矩形所使用的画笔样式。

from PyQt5.QtWidgets import QMainWindow, QApplication, QVBoxLayout, QWidgetfrom PyQt5.QtPdfWidgets import QPdfViewfrom PyQt5.QtPdf import QPdfDocumentfrom PyQt5.QtCore import QPoint, QRect, QUrlfrom PyQt5.QtGui import QPainter, QColor, QPenimport sys# ... (FREE_STATE, BUILDING_SQUARE等定义)class CustomQPdfView(QPdfView):    def __init__(self, parent=None):        super().__init__(parent)        # 初始化矩形绘制的起始点和结束点        self.begin = QPoint()        self.end = QPoint()        # 初始化绘图状态为自由状态        self.state = FREE_STATE        # 设置矩形绘制的画笔:半透明红色,宽度为2        self.pen = QPen(QColor(255, 0, 0, 150))         self.pen.setWidth(2)        # 可选:设置组件的初始几何尺寸,如果需要的话        # self.setGeometry(30, 30, 600, 400) 

3. 重写paintEvent方法

paintEvent是Qt组件进行绘制的核心方法。在这里,我们将在父类的绘图(即PDF内容的渲染)完成后,再绘制我们的自定义矩形。关键在于QPainter(self.viewport()),它确保我们的绘制操作是作用在QPdfView的内部视口上,而不是QPdfView组件本身。

    def paintEvent(self, event):        super().paintEvent(event) # 首先调用父类的paintEvent,绘制PDF内容        # 创建一个QPainter,作用于QPdfView的视口        painter = QPainter(self.viewport())        painter.setPen(self.pen)        # 绘制矩形,如果起始点和结束点有效        if not self.begin.isNull() and not self.end.isNull():            # .normalized()确保QRect的top-left和bottom-right坐标是正确的,            # 无论用户从哪个方向拖动鼠标            painter.drawRect(QRect(self.begin, self.end).normalized())

4. 处理鼠标事件

鼠标事件是实现交互式绘图的关键。我们将重写mousePressEvent、mouseMoveEvent和mouseReleaseEvent来捕获用户的鼠标操作。

mousePressEvent:当鼠标按下时,根据当前鼠标位置判断是开始绘制新矩形,还是编辑现有矩形的边。为了提供更好的用户体验,我们设置了一个小的容差区域来检测边缘点击。

    def mousePressEvent(self, event):        # 如果已经存在一个矩形,判断是否点击到其边缘进行编辑        if not self.begin.isNull() and not self.end.isNull():            p = event.pos()            rect = QRect(self.begin, self.end).normalized()            # 检查是否接近矩形的左边或右边,提供3像素的容差            if abs(rect.left() - p.x()) <= 3 and rect.top() <= p.y() <= rect.bottom():                self.state = BEGIN_SIDE_EDIT                return            elif abs(rect.right() - p.x()) <= 3 and rect.top() <= p.y() <= rect.bottom():                self.state = END_SIDE_EDIT                return        # 如果不是编辑现有矩形,则开始绘制新矩形        self.state = BUILDING_SQUARE        self.begin = event.pos()        self.end = event.pos()        # 注意:这里不需要立即调用repaint,因为mouseMoveEvent会处理后续的刷新

apply_event辅助方法:这个方法根据当前绘图状态更新矩形的begin和end点。它封装了不同状态下的点更新逻辑。

    def apply_event(self, event):        if self.state == BUILDING_SQUARE:            self.end = event.pos()        elif self.state == BEGIN_SIDE_EDIT:            # 仅修改x坐标以调整左边            self.begin.setX(event.x())        elif self.state == END_SIDE_EDIT:            # 仅修改x坐标以调整右边            self.end.setX(event.x())

mouseMoveEvent:当鼠标移动时,如果处于绘图或编辑状态,则调用apply_event更新矩形坐标。最关键的一步是调用self.viewport().repaint() 来立即刷新视口,确保矩形的变化能够即时显示在PDF内容之上。

    def mouseMoveEvent(self, event):        if self.state != FREE_STATE: # 只有在绘

以上就是PyQt/PySide中QPdfView子类化以支持交互式矩形绘制教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1373839.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
NumPy多维数组的形状、维度顺序与内存布局详解
上一篇 2025年12月14日 13:37:06
Python中’pip’命令未识别问题的彻底解决方案
下一篇 2025年12月14日 13:37:22

相关推荐

  • 高德外卖如何联系客服_高德外卖联系客服方法

    高德外卖如何联系客服_高德外卖联系客服方法高德外卖如何联系客服_高德外卖联系客服方法高德外卖如何联系客服_高德外卖联系客服方法高德外卖如何联系客服_高德外卖联系客服方法

    01.可通过高德地图App订单页联系客服或拨打400-810-0080人工热线,非紧急问题可进入帮助中心提交反馈获取支持。 如果您在使用高德外卖服务时遇到订单问题或需要帮助,但无法直接找到联系客服的入口,可能会导致问题无法及时解决。以下是几种有效的联系客服方式: 本文运行环境:iPhone 15 P…

    2026年10月7日 • 用户投稿
    300
  • 如何在Java中高效找出数组中缺失的数字

    如何在Java中高效找出数组中缺失的数字如何在Java中高效找出数组中缺失的数字如何在Java中高效找出数组中缺失的数字如何在Java中高效找出数组中缺失的数字

    本文旨在提供一个简洁高效的Java解决方案,用于在一个升序整数数组中查找缺失的数字。通过使用嵌套循环,我们可以轻松地识别并输出数组中所有缺失的数值,避免复杂的逻辑判断和额外的存储空间。本文将详细介绍该方法的实现原理和示例代码,帮助读者理解和应用。 算法原理 给定一个升序排列的整数数组,找出其中缺失的…

    2026年10月7日 • 用户投稿
    100
  • Win10系统运行软件时如何跳过需要管理员权限的提示?

    Win10系统运行软件时如何跳过需要管理员权限的提示?Win10系统运行软件时如何跳过需要管理员权限的提示?Win10系统运行软件时如何跳过需要管理员权限的提示?Win10系统运行软件时如何跳过需要管理员权限的提示?

    在windows 10系统里,当运行某些第三方软件时,系统通常会要求提供管理员权限。对于那些频繁使用的应用程序而言,每次都手动确认可能会显得有些繁琐。那么,有没有办法让这些程序不再弹出这样的提示呢?接下来就教大家一种简单的方法来解决这个问题。步骤如下: 首先,在你想要设置的程序图标上右键点击,然后选…

    2026年10月7日 • 用户投稿
    300
  • 与英伟达达成合作 纳微半导体股价盘后涨超150%

    与英伟达达成合作 纳微半导体股价盘后涨超150%与英伟达达成合作 纳微半导体股价盘后涨超150%与英伟达达成合作 纳微半导体股价盘后涨超150%与英伟达达成合作 纳微半导体股价盘后涨超150%

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 5月22日,纳微半导体(Navitas)美股盘后涨超150%,英伟达选择Navitas合作开发下一代800伏高压直流架构。 当地时间5月21日,纳微半导体公司宣布与英伟达合作开发下一代800V高…

    2026年10月7日 • 用户投稿
    200
  • Docker部署Java应用完整详细步骤指南

    Docker部署Java应用完整详细步骤指南Docker部署Java应用完整详细步骤指南Docker部署Java应用完整详细步骤指南Docker部署Java应用完整详细步骤指南

    部署java应用到docker的核心在于编写dockerfile并构建镜像,随后运行容器并进行优化与配置管理。1. 编写dockerfile,基于openjdk:17-jdk-slim镜像,复制jar文件并设置启动命令;2. 使用docker build命令构建镜像;3. 通过docker run运…

    2026年10月7日 • 用户投稿
    000
  • 电脑怎么对网络进行重置

    电脑怎么对网络进行重置电脑怎么对网络进行重置电脑怎么对网络进行重置电脑怎么对网络进行重置

    随着电脑使用时间的增长,难免会出现一些小问题,例如网络连接异常或频繁弹出错误提示。针对网络故障,重置网络设置是一种有效的解决方式。那么具体该如何操作呢?下面为大家详细介绍在windows 10系统中重置网络的步骤。 操作步骤如下: 在Win10桌面右下角找到网络图标,右键点击该图标,选择“打开网络和…

    2026年10月7日 • 用户投稿
    200
  • windows远程桌面连接不上如何解决_远程桌面无法连接问题排查与修复

    首先确认目标计算机已启用远程桌面功能,依次检查防火墙规则是否放行远程桌面、Remote Desktop Services服务是否正常运行,通过组策略禁用WDDM图形驱动兼容性问题,修改注册表fDenyTSConnections值为0以启用RDP,最后在客户端通过组策略禁用UDP协议强制使用TCP,确…

    2026年10月7日
    400
  • Veo 3— 谷歌推出的新一代视频生成模型

    Veo 3— 谷歌推出的新一代视频生成模型Veo 3— 谷歌推出的新一代视频生成模型Veo 3— 谷歌推出的新一代视频生成模型Veo 3— 谷歌推出的新一代视频生成模型

    Veo 3是什么 veo 3是谷歌i/o开发者大会上发布的新一代视频生成模型。veo 3是谷歌首个可生成视频背景音效的模型,能合成画面,能为鸟鸣、街头交通等场景配上相应的音效,可生成人物对话。模型在物理模拟与口型同步方面表现出色,视频中的人物口型能与生成的对话完美匹配。veo 3能生成高质量的108…

    2026年10月7日 • 用户投稿
    100
  • InternetExplorer浏览器重新安装_IE浏览器修复与重新安装方法

    InternetExplorer浏览器重新安装_IE浏览器修复与重新安装方法InternetExplorer浏览器重新安装_IE浏览器修复与重新安装方法InternetExplorer浏览器重新安装_IE浏览器修复与重新安装方法InternetExplorer浏览器重新安装_IE浏览器修复与重新安装方法

    无法直接卸载IE,需通过关闭并重新启用功能、系统还原或重置系统来“重新安装”;2. 关闭IE功能后重启并重新启用可解决多数问题;3. 若无效,可尝试系统还原至问题前状态;4. 重置IE设置可恢复默认配置,解决因错误设置导致的问题;5. 使用DISM命令修复系统镜像可解决系统级损坏;6. 最后手段为重…

    2026年10月7日 • 用户投稿
    600
  • Spring Boot接口幂等性的实现方案

    Spring Boot接口幂等性的实现方案Spring Boot接口幂等性的实现方案Spring Boot接口幂等性的实现方案Spring Boot接口幂等性的实现方案

    接口幂等性是指无论调用接口多少次,结果和系统状态都保持一致,防止重复提交造成数据混乱。1. 基于token机制:客户端获取唯一token并随请求提交,服务端校验后执行业务逻辑并删除token,适用于用户重复点击场景;2. 业务唯一id机制:客户端生成唯一id,服务端校验是否已处理,保障业务层幂等性;…

    2026年10月7日 • 用户投稿
    500
  • 威尔高:DC-DC产品实现终端小批量出货

    威尔高:DC-DC产品实现终端小批量出货威尔高:DC-DC产品实现终端小批量出货威尔高:DC-DC产品实现终端小批量出货威尔高:DC-DC产品实现终端小批量出货

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 近日,威尔高在接受机构调研时表示,泰国经营正按计划有序推进,主要以ai电源和汽车电子产品为主。在ai电源产品领域,dc-dc产品上突破30l产品技术壁垒,实现终端小批量出货,通过对高散热材料的研…

    2026年10月7日 • 用户投稿
    100
  • 铁威马or绿联 谁是打工人的新宠nas

    铁威马or绿联  谁是打工人的新宠nas铁威马or绿联  谁是打工人的新宠nas铁威马or绿联  谁是打工人的新宠nas铁威马or绿联  谁是打工人的新宠nas

    对许多企业而言,工作素材的存储与高效调用至关重要。nas凭借大容量存储和高速传输能力,已成为众多职场人士不可或缺的工具。目前,不少用户在绿联dxp 6800 plus与铁威马f6-424 max之间犹豫不决。唯有深入对比两者差异,才能选出最契合实际工作需求的设备。 一、性能对决:铁威马F6-424 …

    2026年10月7日 • 用户投稿
    300
  • Java实现邮件发送功能的详细配置与代码示例

    Java实现邮件发送功能的详细配置与代码示例Java实现邮件发送功能的详细配置与代码示例Java实现邮件发送功能的详细配置与代码示例Java实现邮件发送功能的详细配置与代码示例

    要在spring boot项目中实现邮件发送功能,首先需添加spring-boot-starter-mail依赖,接着在配置文件中设置邮箱信息如host、port、username和授权码等,然后通过注入javamailsender类编写邮件服务逻辑,最后可通过controller或测试类调用发送邮…

    2026年10月7日 • 用户投稿
    700
  • 修改MySQL错误日志编码避免记录乱码信息

    mysql错误日志出现乱码的主要原因是日志编码与系统或查看工具不一致,解决方法如下:1. 在my.cnf或my.ini中配置character-set-server=utf8mb4和collation-server=utf8mb4_unicode_ci,统一数据库字符集以影响日志输出;2. 确保终端…

    2026年10月7日
    100
  • excel如何把一个单元格拆分成多行_excel单元格内容拆分为多行显示技巧

    excel如何把一个单元格拆分成多行_excel单元格内容拆分为多行显示技巧excel如何把一个单元格拆分成多行_excel单元格内容拆分为多行显示技巧excel如何把一个单元格拆分成多行_excel单元格内容拆分为多行显示技巧excel如何把一个单元格拆分成多行_excel单元格内容拆分为多行显示技巧

    使用文本分列、公式、Power Query或VBA可将Excel单元格内多段内容拆分为独立行。1、文本分列适用于分隔符明确的内容,先拆分为列再转置为行;2、通过TRIM、MID、SUBSTITUTE等函数结合CHAR(10)提取换行符分隔的内容;3、Power Query支持按分隔符将内容拆分为多行…

    2026年10月7日 • 用户投稿
    300
  • Win10 Windows Defender怎么添加信任软件?

    Win10 Windows Defender怎么添加信任软件?Win10 Windows Defender怎么添加信任软件?Win10 Windows Defender怎么添加信任软件?Win10 Windows Defender怎么添加信任软件?

    在windows 10系统中,自带的windows defender是一款能够有效保障计算机安全的防病毒软件,但它有时可能会错误地将某些安全的程序识别为威胁,从而导致这些程序无法正常使用。为了避免这种情况,我们可以将这些程序添加到windows defender的信任列表中。 具体操作步骤如下: 点…

    2026年10月7日 • 用户投稿
    100
  • 滴答清单怎么备份和恢复数据_滴答清单数据备份与恢复操作步骤

    滴答清单怎么备份和恢复数据_滴答清单数据备份与恢复操作步骤滴答清单怎么备份和恢复数据_滴答清单数据备份与恢复操作步骤滴答清单怎么备份和恢复数据_滴答清单数据备份与恢复操作步骤滴答清单怎么备份和恢复数据_滴答清单数据备份与恢复操作步骤

    答案:可通过滴答清单的云同步、本地导出、文件导入和第三方云备份功能确保数据安全。首先登录账号并开启自动同步,实现多设备实时更新;其次在“数据与隐私”中导出任务为.ics、.txt或.csv格式并保存至本地或邮件;随后在新设备上通过“导入数据”选择对应文件恢复内容,注意保持应用运行直至完成;最后启用i…

    2026年10月7日 • 用户投稿
    000
  • Windows 11更新:新增打印安全功能及关键修复

    Windows 11更新:新增打印安全功能及关键修复Windows 11更新:新增打印安全功能及关键修复Windows 11更新:新增打印安全功能及关键修复Windows 11更新:新增打印安全功能及关键修复

    N软网报道,微软近日发布了Windows 11的新版本,面向Windows Insider计划中的Canary频道用户推出。该版本编号为26016,并且还提供了ISO文件供下载。这是2023年度Canary频道的最后一个版本。 此次更新新增了Windows Protected Print Mode功…

    2026年10月7日 • 用户投稿
    100
  • 鉴定师APP付款失败怎么办_鉴定师APP支付问题解决与重试

    鉴定师APP付款失败怎么办_鉴定师APP支付问题解决与重试鉴定师APP付款失败怎么办_鉴定师APP支付问题解决与重试鉴定师APP付款失败怎么办_鉴定师APP支付问题解决与重试鉴定师APP付款失败怎么办_鉴定师APP支付问题解决与重试

    首先检查网络连接,确认支付账户余额与限额,更新APP及系统版本,重新添加支付方式,清除缓存并重启应用,尝试其他设备登录支付,最后联系客服获取交易日志以定位问题。 如果您在使用鉴定师APP进行付款时遇到失败提示,可能是由于网络、账户或支付方式等多种因素导致。以下是解决此问题的步骤: 本文运行环境:iP…

    2026年10月7日 • 用户投稿
    000
  • 景旺电子:控股股东及实际控制人拟合计减持不超3%股份

    景旺电子:控股股东及实际控制人拟合计减持不超3%股份景旺电子:控股股东及实际控制人拟合计减持不超3%股份景旺电子:控股股东及实际控制人拟合计减持不超3%股份景旺电子:控股股东及实际控制人拟合计减持不超3%股份

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 5月21日,景旺电子发布公告称,公司控股股东深圳市景鸿永泰投资控股有限公司计划减持不超过1368.91万股,占公司总股本的1.46%;控股股东智创投资有限公司计划减持不超过1398.8万股,占公…

    2026年10月7日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信