PySide(PyQT)的视图(QGraphicsView)范例(一) 基本框架
最近学习了视图(QGraphicsView)的知识,总结一下,做一个demo以备忘。在demo中演示了常用的设置方法和信号槽传递机制。
QT的视图(QGraphicsView)体系是建立在场景(QGraphicsScene)基础上的,场景(QGraphicsScene)是图形项(QGraphicsItem)的容器,图形项(QGraphicsItem)最终呈现的显示元素。
基本的框架演示:
# 设置样本图片的QGraphicsView模型
from PySide6.QtCore import Qt, QRectF
from PySide6.QtGui import QPainter, QPen, QColor, QAction, QMouseEvent
from PySide6.QtWidgets import QGraphicsView, QGraphicsScene, QGraphicsPixmapItem, QGraphicsRectItem, QMenu, QWidget, \QVBoxLayout, QFrame, QSizePolicy# 设置矩形方框(QGraphicsRectItem)模型
class MyRectItem(QGraphicsRectItem):def __init__(self, temp_pen, normal_pen, *args):super().__init__(*args)self.temp_pen = temp_pen # 临时画笔self.normal_pen = normal_pen # 正常画笔# 启用鼠标跟踪,以便在没有按下鼠标按钮时也能接收鼠标移动事件self.setAcceptHoverEvents(True)def hoverEnterEvent(self, event: QMouseEvent):"""鼠标进入项的事件处理"""print("鼠标进入项")super().hoverEnterEvent(event)self.setPen(self.temp_pen)def hoverLeaveEvent(self, event: QMouseEvent):"""鼠标离开项的事件处理"""print("鼠标离开项")super().hoverLeaveEvent(event)self.setPen(self.normal_pen)# 设置QGraphicsView模型
class MyView(QGraphicsView):def __init__(self, parent=None, autoScale=True):super().__init__(parent)self.autoScale = autoScale # 自动缩放标志,是否全画幅显示self.set_scene() # 设置场景self.set_mouse() # 设置鼠标self.set_flags() # 设置标志self.set_menu() # 设置菜单def set_scene(self):"""设置场景"""self.scene = QGraphicsScene() # 创建窗口场景# 设置渲染提示self.setRenderHint(QPainter.Antialiasing) # 开启抗锯齿self.setRenderHint(QPainter.SmoothPixmapTransform) # 开启平滑缩放# 设置缩放锚点self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse) # 转换时以鼠标为中心self.setResizeAnchor(QGraphicsView.AnchorUnderMouse) # 缩放时以鼠标为中心self.setScene(self.scene) # 将场景应用到视窗中def set_mouse(self):"""设置鼠标"""self.setMouseTracking(True) # 设置鼠标跟踪# 鼠标的实时位置(视窗坐标)self.view_x = 0self.view_y = 0# 鼠标的实时位置(场景坐标)self.scene_x = 0self.scene_y = 0# 鼠标按下时的位置(场景坐标)self.press_x = Noneself.press_y = None# 鼠标释放时的位置(场景坐标)self.release_x = 0self.release_y = 0# 处理滚轮事件以实现缩放def wheelEvent(self, event):"""处理滚轮事件以实现缩放"""factor = 1.001 ** event.angleDelta().y() # 滚轮每滚动一格,缩放比例变化self.scale(factor, factor)def set_flags(self):"""设置标志"""passdef set_menu(self):"""设置菜单"""pass# 设置图像文件def set_image(self, pixmap):self.scene.clear() # 清空场景self.scene_rect = QRectF(0, 0, pixmap.width(), pixmap.height()) # 设置场景范围self.image_item = QGraphicsPixmapItem(pixmap) # 创建图片对象self.scene.addItem(self.image_item) # 将图片对象添加到场景中self.setAlignment(Qt.AlignmentFlag.AlignCenter) # 设置视图对齐方式if self.autoScale:self.fitInView(self.image_item, Qt.AspectRatioMode.KeepAspectRatio) # 设置视图适应图片,全幅显示if __name__ == "__main__":import sysfrom PySide6.QtWidgets import QApplicationfrom PySide6.QtGui import QPixmapapp = QApplication(sys.argv)widget = QWidget() # 创建窗口对象widget.resize(800, 600) # 设置窗口大小widget.layout = QVBoxLayout(widget) # 创建垂直布局对象widget.view = MyView(widget) # 创建MyView对象widget.layout.addWidget(widget.view) # 将视图添加到布局中pixmap = QPixmap("your/image/path") # 创建QPixmap对象widget.show() # 显示窗口widget.view.set_image(pixmap) # 设置图像文件sys.exit(app.exec()) # 进入程序的主循环,并通过exit()函数确保主循环安全结束
基本框架具备了图像显示和鼠标滚轮缩放的功能:

注意:
widget.show() # 显示窗口
widget.view.set_image(pixmap) # 设置图像文件
这两行代码的顺序一定不能反,如果将 widget.show() 放在widget.view.set_image(pixmap)后面,将会是下面的显示效果,初始化后不能全幅显示。

这是因为 fitInView 方法的行为依赖于视图的实际大小,而在窗口尚未显示时,视图的大小可能是未确定的或者是默认值,从而导致 fitInView 无法正确计算和应用缩放,而show()函数执行之后就确定了视图的大小。
相关文章:
PySide(PyQT)的视图(QGraphicsView)范例(一) 基本框架
最近学习了视图(QGraphicsView)的知识,总结一下,做一个demo以备忘。在demo中演示了常用的设置方法和信号槽传递机制。 QT的视图(QGraphicsView)体系是建立在场景(QGraphicsScene)基础…...
深入理解seata使用和源码分析
一、数据库事务ACID特性 基础概念:事务ACID A(Atomic):原子性,构成事务的所有操作,要么都执行完成,要么全部不执行,不可能出现部分成功部分失 败的情况。C(Consistency):一致性,在事务执行前后,数据库的一致性约束没有被破坏。比如:张三向李四转100元, 转账前和…...
centos8更换阿里云yum源
1.centos8更换为阿里云yum源 2.更换阿里云Yum-centos8源 mv /etc/yum.repos.d/CentOS-Stream-BaseOS.repo /etc/yum.repos.d/CentOS-Stream-BaseOS.repo.backupcurl -o /etc/yum.repos.d/CentOS-Stream-BaseOS.repo https://mirrors.aliyun.com/repo/Centos-8.repowget -O /et…...
单粒子翻转对FPGA的影响及解决方法
1 单粒子翻转对FPGA 的影响 对于在轨的空间应用而言,需要考虑外太空辐射对电子元器件带来的影响,包括单粒子翻转(Single Event Upset,SEU)、多粒子翻转(Multiple Bit Upset,MBU)、单粒子瞬态效应(Single Event Transient,SET)、单粒子功能中断(SingleEvent Functi…...
君正SOC芯片 T31X智能视频应用处理器 高集成度 超低功耗 提供软硬件资料+样品测试
君正(Ingenic)T31X是一款面向智能视频应用的高性能、低功耗处理器,适用于安防监控、智能家居和物联网等领域。以下是其主要技术参数: 1. 处理器(CPU): 架构:XBurst-1内核主频&…...
基于Python Django的人脸识别上课考勤系统(附源码,部署)
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
论述AI对学习发展的改变(网页设计)
谈自己对AI看法 AI,即人工智能,是当今科技领域最具影响力和变革性的技术之一,对其看法可以从多个方面来探讨 积极方面 强大的技术能力 高效的数据处理出色的学习能力广泛的应用价值改善生活质量科学研究的有力助手加速科学发现 挑战和问题 伦…...
JS—组成:2分钟掌握什么是ECMAScript操作,什么是DOM操作,什么是BOM操作
个人博客:haichenyi.com。感谢关注 1. 目录 1–目录2–组成3–内置对象 2. 组成 一直都在说JS,JS,到底啥是JS有了解过吗?JS由哪几部分组成的呢? 定义: JavaScript是一种轻量级、解释型或即时编译型的编程语…...
Oracle数据库监听学习
官方文档: Net Services Administrators Guide Net Services Reference 一、动态注册 1.实例启动后,LREG 进程每分钟自动将服务名(service_name)注册到监听器中 也可以通过 alter system register 命令实现立刻注册。&#x…...
Vue Hooks 深度解析:从原理到实践
Vue Hooks 深度解析:从原理到实践 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家!点我试试!! 文章目录 Vue Hooks 深度解析:从原理到实践一、背景…...
5c/c++内存管理
1. C/C内存分布 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* ptr1 (int*)malloc(sizeof(int) * 4);i…...
Android14 OTA差分包升级报Package is for source build
制作好差分包,使用adb线刷模式验证ota升级,出现E:Package is for source build错误 使用adb方式验证 进入recovery模式 adb reboot recovery稍等一会界面会提示 Now send the package you want to apply to the device with "adb sidelaod <…...
C++中的无锁编程
引言 在当今多核处理器普及的时代,并发编程已成为高性能应用程序开发的关键技术。传统的基于锁的同步机制虽然使用简单,但往往会带来性能瓶颈和死锁风险。无锁编程(Lock-Free Programming)作为一种先进的并发编程范式,…...
7. 机器人记录数据集(具身智能机器人套件)
1. 树莓派启动机器人 conda activate lerobotpython lerobot/scripts/control_robot.py \--robot.typelekiwi \--control.typeremote_robot2. huggingface平台配置 huggingface官网 注册登录申请token(要有写权限)安装客户端 # 安装 pip install -U …...
设计模式 + java8方法引用 实现任意表的过滤器
会用到下面2个依赖,原因是在今天的案例中,我想在我代码中使用上Entity::getFieldName 这种形式 LambdaQueryWrapper<ApplicationDashboard> queryWrapper new LambdaQueryWrapper<>(); queryWrapper.eq(ApplicationDashboard::getAppCode,…...
分布式锁—5.Redisson的读写锁二
大纲 1.Redisson读写锁RedissonReadWriteLock概述 2.读锁RedissonReadLock的获取读锁逻辑 3.写锁RedissonWriteLock的获取写锁逻辑 4.读锁RedissonReadLock的读读不互斥逻辑 5.RedissonReadLock和RedissonWriteLock的读写互斥逻辑 6.写锁RedissonWriteLock的写写互斥逻辑…...
【C++设计模式】第七篇:桥接模式(Bridge)
注意:复现代码时,确保 VS2022 使用 C17/20 标准以支持现代特性。 抽象与实现的解耦之道 1. 模式定义与用途 核心思想 桥接模式:将抽象部分与实现部分分离,使二者可以独立变化。关键用途: 1.拆分复杂继承…...
Html常用代码
Html常用代码 文章目录 Html常用代码1-常用的Html代码1-Html模板 2-快速部署Live-Server1-Windows系统步骤 1:安装 Node.js步骤 2:安装 live - server步骤 3:使用 live - server 运行本地项目 2-Mac系统步骤 1:安装 Node.js步骤 2…...
c++中的一些控制符
控制符在<iomanip>头文件里 一、设置显示小数精度 :setprecision() float A3.1234; 默认有效位为6位,steprecision(3)→设置有效位为3位 【3.12】 可以与fixed搭配用,cout<<fixed<<setprecision(3)<&l…...
Go语言里面的堆跟栈 + new 和 make + 内存逃逸 + 闭包
在 Go 语言中,堆(Heap)和栈(Stack)是内存管理中的两个重要概念,它们在内存分配、数据存储和使用场景等方面存在明显差异。 栈(Stack) 栈是一种具有后进先出(LIFO&#…...
蓝桥备赛(11)- 数据结构、算法与STL
一、数据结构 1.1 什么是数据结构? 在计算机科学中,数据结构是一种 数据组织、管理和存储的格式。它是相互之间存在一种 或多种特定关系的数据元素的集合。 ---> 通俗点,数据结构就是数据的组织形式 , 研究数据是用什么方…...
react 19版中路由react-router-dom v7版的使用
路由的安装: npm install react-router-dom在src目录下建一个router文件夹 在router文件夹里面建一个index.tsx index.tsx内容: import React from react; import {BrowserRouter as Router,Routes,Route,Link } from react-router-dom; import ManuLi…...
WPS工具栏添加Mathtype加载项
问题描述: 分别安装好WPS和MathType之后,WPS工具栏没直接显示MathType工具,或者是前期使用正常,由于WPS更新之后MathType工具消失,如下图 解决办法 将文件“MathType Commands 2016.dotm”和“MathPage.wll”从Matht…...
Tauri+React+Ant Design跨平台开发环境搭建指南
TauriReactAnt Design跨平台开发环境搭建指南 一、环境配置与工具链搭建 1.1 基础环境准备 必备组件: Rust工具链(v1.77): curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh Node.js LTS(v20.11.1&a…...
PDF转JPG(并去除多余的白边)
首先,手动下载一个软件(poppler for Windows),下载地址:https://github.com/oschwartz10612/poppler-windows/releases/tag/v24.08.0-0 否则会出现以下错误: PDFInfoNotInstalledError: Unable to get pag…...
std::string的模拟实现
目录 string的构造函数 无参数的构造函数 根据字符串初始化 用n个ch字符初始化 用一个字符串的前n个初始化 拷贝构造 用另一个string对象的pos位置向后len的长度初始化 [ ]解引用重载 迭代器的实现 非const版本 const版本 扩容reserve和resize reserve resize p…...
wordpress自定the_category的输出结构
通过WordPress的过滤器the_category来自定义输出内容。方法很简单,但是很实用。以下是一个示例代码: function custom_the_category($thelist, $separator , $parents ) {// 获取当前文章的所有分类$categories get_the_category();if (empty($categ…...
doris: Oracle
Apache Doris JDBC Catalog 支持通过标准 JDBC 接口连接 Oracle 数据库。本文档介绍如何配置 Oracle 数据库连接。 使用须知 要连接到 Oracle 数据库,您需要 Oracle 19c, 18c, 12c, 11g 或 10g。 Oracle 数据库的 JDBC 驱动程序,您可以从 Maven 仓库…...
mysql中什么机制保证宕机数据恢复
MySQL 通过多种机制来保证在宕机或意外崩溃时数据的完整性和可恢复性。这些机制主要包括 事务日志、崩溃恢复 和 数据持久化 等。以下是 MySQL 中保证数据恢复的核心机制: 1. 事务日志(Transaction Log) 事务日志是 MySQL 实现数据恢复的核心机制之一,主要包括 Redo Log(…...
前端面试技术性场景题
87.场景面试之大数运算:超过js中number最大值的数怎么处理 在 JavaScript 中,Number.MAX_SAFE_INTEGER(即 2^53 - 1,即 9007199254740991)是能被安全表示的最大整数。超过此值时,普通的 Number 类型会出现…...
