python编程使用PyQt制作预览窗口游戏中的小地图

 更新时间:2021年10月28日 16:00:09   作者:在逆境中蜕变  
这篇文章主要为大家介绍了python使用PyQt制作预览窗口游戏中的小地图实现示例过程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步

写作思路

1、简述实现原理
2、部分代码解析
3、位置同步解析(①上下两屏位置同步②编辑屏位置保持不变)
效果图如下:
版本1:

在这里插入图片描述

这就是我们常见的预览窗口,上面预览窗口移动/缩放小方框都会导致下面的编辑界面位置发生变化,同理,下面的编辑界面的移动/缩放也会导致上面的小方框变化,并且上面预览图是编辑窗口的同比例缩放

版本2:

在这里插入图片描述

在版本1的基础上,加入了点的删除和增加,并对画布进行了扩展,同时保持编辑界面的画面位置不变

1、简述实现原理

首先最重要的,要知道我们这些是用QGraphicsView、QGraphicsScene、QGraphicsRectItem 这三个基类实现的
实现方法如下:
①QGraphicsScene.render渲染编辑窗口获得image,将image按照预览窗口的比例进行缩放并放入overView
②创建一个矩形框,框是按照编辑器窗口和image的比例进行绘制的
③拖动或者缩放预览窗口的时候,编辑窗口按照同样的比例移动缩放,拖动或者缩放预览窗口的时候同理

2、部分代码解析

①方框的完整代码

from PyQt5.QtCore import Qt, QRectF
from PyQt5.QtGui import QBrush, QPainterPath, QPainter, QColor, QPen
from PyQt5.QtWidgets import QGraphicsRectItem, QGraphicsItem
class GraphicsRectItem(QGraphicsRectItem):
    def __init__(self, scene, *args):
        super().__init__(*args)
        self.scene = scene
        self.setFlag(QGraphicsItem.ItemIsMovable, True)
        self.setFlag(QGraphicsItem.ItemIsSelectable, True)
        self.setFlag(QGraphicsItem.ItemSendsGeometryChanges, True)
        self.setFlag(QGraphicsItem.ItemIsFocusable, True)
    def shape(self):
        path = QPainterPath()
        path.addRect(self.rect())
        return path
    def paint(self, painter, option, widget=None):
        # 框选出来的方形
        painter.setBrush(QBrush(QColor(0, 0, 0, 0)))
        painter.setPen(QPen(QColor(0, 0, 0), 0.1, Qt.SolidLine))
        painter.drawRect(self.rect())
        x = self.rect().x()
        y = self.rect().y()
        width = self.rect().width()
        height = self.rect().height()
        otherColor = QColor(150, 150, 150, 50)
        painter.setBrush(QBrush(otherColor))
        # 下面这部分代码是使得小方框以外的地方多一层蒙皮
        painter.setPen(QPen(QColor(0, 0, 0, 0), 1.0, Qt.SolidLine))
        painter.drawRect(QRectF(x-10000, y, 20000+width, -20000+height)) #上
        painter.drawRect(QRectF(x-10000, y+height, 20000+width, 20000+height)) #下
        painter.drawRect(QRectF(x, y, -20000, height)) #左
        painter.drawRect(QRectF(x+width, y, 20000, height)) #右
        painter.setRenderHint(QPainter.Antialiasing)
        painter.setBrush(QBrush(QColor(255, 0, 0, 255)))
        painter.setPen(QPen(QColor(0, 0, 0, 255), 1.0, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))

这就是前面提到的 “item” 《scene view item的使用》,QGraphicsRectItem 也是继承自QGraphicsItem的,这里的方框就是我们要加到OverView界面中的那个定位方框

②编辑界面

class GraphicsWindow(QGraphicsView):
	def __init__(self, parent=None):
        super(GraphicsWindow, self).__init__(parent)
        ......
        self.scene = ViewPortGraphScene(self)
        self.setScene(self.scene)
        ......
        self.setSceneRect(-1 << 30, -1 << 30, 1 << 31, 1 << 31)
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
	def addPoint(self, x, y):
        self.scene.addEllipse(x, y, 16, 16, QPen(QColor(Qt.red)), QBrush(QColor(Qt.red)))
	def mousePressEvent(self, mouseEvent):
		......
        if mouseEvent.button() == Qt.LeftButton:
            if isinstance(self.itemAt(mouseEvent.pos()), QGraphicsEllipseItem):
                self.scene.removeItem(self.itemAt(mouseEvent.pos()))
                self.parent.changeView()
        ......
        super(GraphicsWindow, self).mousePressEvent(mouseEvent)
class ViewPortGraphScene(QGraphicsScene):
    def __init__(self, parent=None):
    	super(ViewPortGraphScene, self).__init__(parent)
    	......
	def drawBackground(self, painter, rect):
		# 自己去画格子吧 hhh

熟悉的操作:
1、创建scene
2、把scene放到view
3、把item放到scene,其中这里的item是点也就是QGraphicsEllipseItem,也是继承自QGraphicsRectItem
使屏幕可以拖动: self.setSceneRect(-1 << 30, -1 << 30, 1 << 31, 1 << 31),因为scene很大,在view里面装不下,所以就可以拖动啦~
**添加点:**如上的addPoint方法
**删除点:**如上的mousePressEvent方法,其中self.itemAt(mouseEvent.pos())可以获取当前鼠标位置是什么东西

③预览窗口

class OverViewGraphicsWindow(QGraphicsView):
    def __init__(self, parent=None):
        super(OverViewGraphicsWindow, self).__init__(parent)
        ......
        self.scene = OverViewGraphScene(self)
        self.item = GraphicsRectItem(self.scene, 0, 0, 50, 25)
        self.scene.addItem(self.item)
        ......
......
class OverViewGraphScene(QGraphicsScene):
    def __init__(self, parent=None):
        super(OverViewGraphScene, self).__init__(parent)

同样的套路:
1、创建scene
2、把scene放到view
3、把item放到scene,其中这里的item是点也就是QGraphicsRectItem,继承自QGraphicsRectItem

3、位置同步解析

①上下两屏位置同步、编辑屏位置保持不变

1、两个pyqtSignal 分别去响应上下两个屏幕的移动和缩放
2、scene的的左上角到当前屏幕中心的长宽来定位(主要用到scene.itemsBoundingRect()、view.mapToScene()、view.mapFromScene()这几个方法),屏幕中心的scene位置可以通过编辑窗口长宽的一半并通过view.mapToScene()来转化

以上就是python使用PyQt制作预览窗口游戏中的小地图的详细内容,更多关于PyQt制作预览游戏小地图窗口的资料请关注脚本之家其它相关文章!

相关文章

  • Python3标准库glob文件名模式匹配的问题

    Python3标准库glob文件名模式匹配的问题

    glob的模式规则与re模块使用的正则表达式并不相同。实际上,glob的模式遵循标准UNIX路径扩展规则。只使用几个特殊字符来实现两个不同的通配符和字符区间。这篇文章主要介绍了Python3标准库glob文件名模式匹配的知识,需要的朋友可以参考下
    2020-03-03
  • Python使用quote()函数对接口请求值进行URL编码

    Python使用quote()函数对接口请求值进行URL编码

    在接口测试自动化中,我们经常会遇到需要构建HTTP请求的情况,尤其是POST请求,确保所有的参数都正确地进行了URL编码是非常重要的一步,Python标准库中的urllib.parse.quote函数就是专门用来进行这种转码的工具,所以本文介绍了使用quote()函数对接口请求值进行URL编码
    2024-08-08
  • Python调用.net动态库实现过程解析

    Python调用.net动态库实现过程解析

    这篇文章主要介绍了Python调用.net动态库实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Pytorch在NLP中的简单应用详解

    Pytorch在NLP中的简单应用详解

    今天小编就为大家分享一篇Pytorch在NLP中的简单应用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Python利用Pillow处理图像的实践指南

    Python利用Pillow处理图像的实践指南

    Pillow,是Python Imaging Library (PIL)的一个分支,用于处理图像,这篇文中主要来和大家详细讲讲Pillow处理图像的具体方法,感兴趣的小伙伴可以了解一下
    2023-05-05
  • Python中字符串切片详解

    Python中字符串切片详解

    这篇文章主要介绍了Python中字符串切片,在python中定义个字符串然后把它赋值给一个变量。我们可以通过下标访问单个的字符,跟所有的语言一样,下标从0开始。这时我们可以通过切片方式来截取出我们定义的字符串的一部分,下面小编将为大家详细介绍,需要的朋友可以参考下
    2021-10-10
  • Python使用tablib生成excel文件的简单实现方法

    Python使用tablib生成excel文件的简单实现方法

    这篇文章主要介绍了Python使用tablib生成excel文件的方法,结合实例形式分析了tablib模块的相关使用技巧,需要的朋友可以参考下
    2016-03-03
  • python实现比较类的两个instance(对象)是否相等的方法分析

    python实现比较类的两个instance(对象)是否相等的方法分析

    这篇文章主要介绍了python实现比较类的两个instance(对象)是否相等的方法,结合实例形式分析了Python判断类的实例是否相等的判断操作实现技巧,需要的朋友可以参考下
    2019-06-06
  • 一文了解Django缓存机制

    一文了解Django缓存机制

    本文主要介绍了一文了解Django缓存机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Python+Kepler.gl轻松制作酷炫路径动画的实现示例

    Python+Kepler.gl轻松制作酷炫路径动画的实现示例

    这篇文章主要介绍了Python+Kepler.gl轻松制作酷炫路径动画的实,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧现示例
    2020-06-06

最新评论