PyQt5中的QGraphicsView()

文章目录

    • 1. 简介
    • 2. 一个简单的示例
    • 2. 加载一幅图片
    • 3. 常用方法示例

1. 简介

QGraphicsView是PyQt5中用于显示图形场景的小部件,它提供了许多常用的方法来控制视图的行为和属性。下面是一些常用的QGraphicsView方法:

  • setScene(scene): 设置要显示的场景。

  • scene(): 获取当前显示的场景。

  • setAlignment(alignment): 设置对齐方式,alignment参数是Qt.AlignmentFlag类型。

  • setRenderHint(hint, on=True): 设置渲染提示,on参数表示是否启用,默认为True。

  • resetMatrix(): 重置视图矩阵。

  • fitInView(rect, aspectRatioMode=Qt.IgnoreAspectRatio): 将指定的矩形区域适配到视图中。

  • setViewportUpdateMode(mode)

    设置视口更新模式,mode可以是以下之一:

    • QGraphicsView.FullViewportUpdate
    • QGraphicsView.MinimalViewportUpdate
    • QGraphicsView.SmartViewportUpdate
    • QGraphicsView.NoViewportUpdate
  • setTransformationAnchor(anchor): 设置变换锚点,用于指定在缩放、旋转等操作中的参考点。

  • setDragMode(mode)
    设置拖拽模式,mode可以是以下之一:
    • QGraphicsView.NoDrag
    • QGraphicsView.ScrollHandDrag
    • QGraphicsView.RubberBandDrag
  • setSceneRect(rect): 设置场景的可视区域。

  • setHorizontalScrollBarPolicy(policy): 设置水平滚动条策略,policy可以是以下之一:

    • Qt.ScrollBarAsNeeded

    • Qt.ScrollBarAlwaysOff

    • Qt.ScrollBarAlwaysOn

  • setVerticalScrollBarPolicy(policy): 设置垂直滚动条策略,policy可以是以上相同的值。

  • viewport(): 获取视口部件。

  • update():强制视图重新绘制。

这些方法使得你能够在QGraphicsView中管理和控制场景的显示和交互。

2. 一个简单的示例

下面是一个简单的示例,演示如何使用QGraphicsView显示一个圆形图形:

import sys
from PyQt5.QtWidgets import QApplication, QGraphicsView, QGraphicsScene, QGraphicsEllipseItem, QVBoxLayout, QWidget
from PyQt5.QtCore import Qtclass GraphicsViewExample(QWidget):def __init__(self):super().__init__()self.init_ui()def init_ui(self):layout = QVBoxLayout()self.setLayout(layout)# 创建一个场景scene = QGraphicsScene()# 在场景中添加一个圆形图形项circle_item = QGraphicsEllipseItem(0, 0, 100, 100)circle_item.setBrush(Qt.blue)scene.addItem(circle_item)# 创建一个视图view = QGraphicsView(scene)layout.addWidget(view)if __name__ == '__main__':app = QApplication(sys.argv)window = GraphicsViewExample()window.setWindowTitle('GraphicsView Example')window.setGeometry(100, 100, 400, 300)window.show()sys.exit(app.exec_())

在这个示例中,我们创建了一个自定义的GraphicsViewExample类,继承自QWidget。在init_ui方法中,我们创建了一个QGraphicsScene对象,并向其中添加了一个圆形图形项。然后,我们创建了一个QGraphicsView对象,并将场景设置为其内容。最后,我们将QGraphicsView添加到布局中并显示窗口。

运行此代码将显示一个窗口,其中包含一个红色的圆形图形。

在这里插入图片描述

2. 加载一幅图片

import sys
from PyQt5.QtWidgets import QApplication, QGraphicsView, QGraphicsScene, QGraphicsPixmapItem, QVBoxLayout, QWidget
from PyQt5.QtGui import QPixmapclass GraphicsViewExample(QWidget):def __init__(self):super().__init__()self.init_ui()def init_ui(self):layout = QVBoxLayout()self.setLayout(layout)# 创建一个场景scene = QGraphicsScene()# 加载图片pixmap = QPixmap("cat.jpg")# 在场景中添加一个图片图形项pixmap_item = QGraphicsPixmapItem(pixmap)scene.addItem(pixmap_item)# 创建一个视图view = QGraphicsView(scene)layout.addWidget(view)if __name__ == '__main__':app = QApplication(sys.argv)window = GraphicsViewExample()window.setWindowTitle('GraphicsView Example')window.setGeometry(100, 100, 400, 300)window.show()sys.exit(app.exec_())

在这个示例中,我们首先创建了一个自定义的GraphicsViewExample类,继承自QWidget。在init_ui方法中,我们创建了一个QGraphicsScene对象,并加载了一张名为"cat.jpg"的图片。然后,我们创建了一个QGraphicsView对象,并将场景设置为其内容。最后,我们将QGraphicsView添加到布局中并显示窗口。

确保将示例中的"image.jpg"替换为你想要加载和显示的图片路径。运行此代码将显示一个窗口,其中包含加载的图片。

在这里插入图片描述

3. 常用方法示例

import sys
from PyQt5.QtWidgets import QApplication, QGraphicsView, QGraphicsScene, QGraphicsPixmapItem, QVBoxLayout, QWidget
from PyQt5.QtGui import QPixmap, QPainter
from PyQt5.QtCore import Qtclass GraphicsViewExample(QWidget):def __init__(self):super().__init__()self.init_ui()def init_ui(self):layout = QVBoxLayout()self.setLayout(layout)# 创建一个场景scene = QGraphicsScene()# 加载图片pixmap = QPixmap("cat.jpg")# 在场景中添加一个图片图形项pixmap_item = QGraphicsPixmapItem(pixmap)scene.addItem(pixmap_item)# 创建一个视图并设置场景self.view = QGraphicsView()self.view.setScene(scene)layout.addWidget(self.view)# 设置对齐方式为居中self.view.setAlignment(Qt.AlignCenter)# 设置渲染提示,启用平滑渲染self.view.setRenderHint(QPainter.SmoothPixmapTransform)# 将指定的矩形适配到视图中self.view.fitInView(pixmap_item, Qt.KeepAspectRatio)# 禁用水平和垂直滚动条self.view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)self.view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)# 设置拖拽模式为手形滚动self.view.setDragMode(QGraphicsView.ScrollHandDrag)# 设置视图更新模式为最小视口更新self.view.setViewportUpdateMode(QGraphicsView.MinimalViewportUpdate)# 设置场景的可视区域self.view.setSceneRect(scene.itemsBoundingRect())if __name__ == '__main__':app = QApplication(sys.argv)window = GraphicsViewExample()window.setWindowTitle('GraphicsView Example')window.setGeometry(100, 100, 400, 300)window.show()sys.exit(app.exec_())

在这个示例中,我们使用了QGraphicsView的一些常用方法:

  • setAlignment():将视图内容居中对齐。
  • setRenderHint():启用平滑渲染,以改善图像显示效果。
  • fitInView():将图像适配到视图中,保持宽高比。
  • setHorizontalScrollBarPolicy()setVerticalScrollBarPolicy():禁用水平和垂直滚动条。
  • setDragMode():设置拖拽模式为手形滚动。
  • setViewportUpdateMode():设置视图更新模式为最小视口更新,以提高性能。
  • setSceneRect():设置场景的可视区域,确保整个场景都可见。

运行结果如下

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/836934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始写 Docker(十四)---重构:实现容器间 rootfs 隔离

本文为从零开始写 Docker 系列第十四篇,实现容器间的 rootfs 隔离,使得多个容器间互不影响。 完整代码见:https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实现有一个大致认识: 核心原理:…

SpringCloud 集成 RocketMQ 及配置解析

文章目录 前言一、SpringCloud 集成 RocketMQ1. pom 依赖2. yml 配置3. 操作实体4. 生产消息4.1. 自动发送消息4.2. 手动发送消息 5. 消费消息 二、配置解析1. spring.cloud.stream.function.definition 前言 定义 Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力…

spacy微调BERT-NER模型

数据准备 加载数据集 from tqdm.notebook import tqdm import osdataset [] with open(train_file, r) as file:for line in tqdm(file.readlines()):data json.loads(line.strip())dataset.append(data)你可以按照 CLUENER 的格式准备训练数据, 例如&#xff1…

(done) Beam search

参考视频1:https://www.bilibili.com/video/BV1Gs421N7S1/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 (beam search 视频) 参考博客1:https://jasonhhao.github.io/2020/06/19/…

在word中创建宏来多级列表的编号不显示的bug

出现问题的示意图如下,可以看出标题前面1.1消失了 第一步:选择开发工具 第二步: 第三步:选择当前文件(创建宏后,方便查找) 第四步: 第五步:打卡VB 第七步&#xf…

ONVIF系列一:ONVIF介绍

感谢博主OceanStar的学习笔记,ONVIF系列二和系列三中安装操作过程及代码实现参考了这位博主的博客。 ONVIF系列: ONVIF系列一:ONVIF介绍 ONVIF系列二:Ubuntu安装gSOAP、生成ONVIF代码框架 ONVIF系列三:ONVIF客户端实现…

机器人开发项目实现过程

比赛项目实现过程 第一步:设置远程桌面连接 登录机器人系统,设置网络,参考远程桌面连接20230525.mp4 外接显示器、鼠标和键盘 登录系统 账户:robuster 密码:123456 建议,手机开热点,机器人…

消费新纪元:探索消费增值的财富之旅

你是否曾对日常消费感到一丝无奈,觉得钱一旦花出去就如同流水般逝去,再也无法追回?现在,让我为你揭示一种革命性的消费观念——消费增值,它不仅能满足你的物质需求,还能让你的资金像滚雪球般持续增长&#…

鸿蒙ArkUI开发:常用布局【弹性布局方向图】

弹性布局方向图 Flex({ direction: FlexDirection.Row }) FlexDirection.Row(默认值):主轴为水平方向,子组件从起始端沿着水平方向开始排布FlexDirection.RowReverse:主轴为水平方向,子组件从终点端沿着F…

vscode 实现本地服务器部署小结

在查阅 MDN 网站的时候,偶然发现的原来 vscode 也可以实现本地化服务器部署,来模拟服务器的运行。 安装插件 在VSCode的插件市场搜索并安装以下插件: – Live Server(用于开启本地服务器) – Debugger for Chrome&a…

算法设计与分析(超详解!) 第三节 贪婪算法

1.贪心算法基础 1.贪心算法的基本思想 贪心算法是从问题的某一个初始解出发,向给定的目标推进。但它与普通递推求解过程不同的是,其推动的每一步不是依据某一固定的递推式,而是做一个当时看似最佳的贪心选择,不断地将问题实例归…

【C++】string类的使用④(字符串操作String operations || 常量成员Member constants)

🔥个人主页: Forcible Bug Maker 🔥专栏: STL || C 目录 前言🔥字符串操作(String operations)c_strdataget_allocatorcopyfindrfindfind_first_offind_last_offind_first_not_offind_last_not…

11、FreeRTOS 队列、队列集,邮箱的使用

文章目录 一、队列的特性1.1 队列常规操作1.2 传输数据的两种方法1.3 队列的阻塞访问 二 队列函数2.1创建2.2 复位2.3 删除2.4 写队列2.5 读队列2.6 查询2.7 覆盖/偷看 三、示例3.1示例 队列的基本使用3.2 示例: 分辨数据源3.3 示例: 传输大块数据3.4 : 邮箱(Mailbox) 四、队列…

白盒测试:覆盖测试及测试用例设计

白盒测试:覆盖测试及测试用例设计 一、实验目的 1、掌握白盒测试的概念。 2、掌握逻辑覆盖法。 二、实验任务 某工资计算程序功能如下:若雇员月工作小时超过40小时,则超过部分按原小时工资的1.5倍的加班工资来计算。若雇员月工作小时超过…

ansible -playbook运维工具、语法、数据结构、命令用法、触发器、角色

目录 配置文件 基本语法规则: YAML支持的数据结构 playbook核心元素 ansible-playbook用法: 触发器 特点: 角色: 习题: 配置文件 playbook配置文件使用yaml语法,YAML 是一门标记性语言,专门用来写配…

windows和Linux卸载移动磁盘

文章目录 Linux卸载磁盘target is busy.window卸载磁盘打开事件查看器 Linux卸载磁盘target is busy. #查看有哪些进程访问挂载点 lsof /media/lei/repository/#杀死进程 pkill node window卸载磁盘 #提示 #该设备正在使用中. 请关闭可能使用该设备的所有程序或窗口,然后重试…

Vue 局部布局 Layout 内部布局 [el-row]、[el-col]

之前的布局容器是一个整体的框架,layout里面的布局其实就是el-row和el-col的组合。 基础布局 使用单一分栏创建基础的栅格布局。 通过 ​row ​和 ​col ​组件,并通过 ​col ​组件的 ​span ​属性我们就可以自由地组合布局。 这种最简单,…

2024年可以做的网上兼职有哪些?10个正规赚钱软件平台分享

在数字化浪潮席卷全球的今天,兼职工作早已不再局限于传统的线下模式。只要有一部手机或电脑,你就能轻松开启兼职之旅,实现躺着也能赚钱的梦想! 接下来,就让我们一起看看2024年那些靠谱又有趣的网上兼职项目吧&#xff…

STK12 RPO模块学习 (1)

一、背景介绍 在STK12中,在Astrogator的模块上开发了新的模块(Rendezvous and proximity operations)。轨道交会接近通常来说是一个很复杂的过程。RPO实现需要对轨道动力学有一个清晰的理解,并且对于Astrogator模块具备很强的背景和经验&…

2024最新软件测试【测试理论+ Linux】面试题(内附答案)

一、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段:需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的 SE 会把需求文档给我们自己先去了解一到两天这样,之后我们会有一个需求澄清会议, …