激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - python編程使用PyQt制作預覽窗口游戲中的小地圖

python編程使用PyQt制作預覽窗口游戲中的小地圖

2022-02-20 00:28在逆境中蛻變 Python

這篇文章主要為大家介紹了python使用PyQt制作預覽窗口游戲中的小地圖實現示例過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步

寫作思路

1、簡述實現原理
2、部分代碼解析
3、位置同步解析(①上下兩屏位置同步②編輯屏位置保持不變)
效果圖如下:
版本1:

python編程使用PyQt制作預覽窗口游戲中的小地圖

這就是我們常見的預覽窗口,上面預覽窗口移動/縮放小方框都會導致下面的編輯界面位置發生變化,同理,下面的編輯界面的移動/縮放也會導致上面的小方框變化,并且上面預覽圖是編輯窗口的同比例縮放

版本2:

python編程使用PyQt制作預覽窗口游戲中的小地圖

在版本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制作預覽游戲小地圖窗口的資料請關注服務器之家其它相關文章!

原文鏈接:https://blog.csdn.net/weixin_40301728/article/details/109654031

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美精品成人一区二区在线观看 | 羞羞视频一区二区 | 亚洲成人在线免费观看 | 国产色爱综合网 | 国产精品一区二区x88av | 史上最强炼体老祖动漫在线观看 | 一级大黄毛片 | 337p日本欧洲亚洲大胆精蜜臀 | 亚洲va久久久噜噜噜久久男同 | 亚洲一区二区在线视频 | 激情国产视频 | 爱福利视频网 | 亚洲国产网站 | 青草av.久久免费一区 | 国产精品高潮视频 | 久久影院一区二区三区 | 精品久久久91 | xvideos korean| 精品国产一区二区亚洲人成毛片 | 黄色网址免费入口 | 久久久久亚洲国产精品 | 色av成人天堂桃色av | 免费黄色欧美视频 | 国产亚洲美女精品久久久2020 | 亚洲午夜在线视频 | 国产资源在线视频 | 成人在线免费小视频 | 国产精品性夜天天视频 | 韩国一大片a毛片 | 法国极品成人h版 | 男女一边摸一边做羞羞视频免费 | 欧美人与禽性xxxxx杂性 | 美女黄污视频 | 久久精品一区视频 | 国产精品一二三区在线观看 | 九九热国产视频 | 成人一区三区 | 青草视频在线观看视频 | 视频一区二区三区视频 | 一区小视频 | 国产精品视频一区二区三区四区五区 |