python編程使用PyQt制作預(yù)覽窗口游戲中的小地圖
寫作思路
1、簡(jiǎn)述實(shí)現(xiàn)原理
2、部分代碼解析
3、位置同步解析(①上下兩屏位置同步②編輯屏位置保持不變)
效果圖如下:
版本1:
這就是我們常見的預(yù)覽窗口,上面預(yù)覽窗口移動(dòng)/縮放小方框都會(huì)導(dǎo)致下面的編輯界面位置發(fā)生變化,同理,下面的編輯界面的移動(dòng)/縮放也會(huì)導(dǎo)致上面的小方框變化,并且上面預(yù)覽圖是編輯窗口的同比例縮放
版本2:
在版本1的基礎(chǔ)上,加入了點(diǎn)的刪除和增加,并對(duì)畫布進(jìn)行了擴(kuò)展,同時(shí)保持編輯界面的畫面位置不變
1、簡(jiǎn)述實(shí)現(xiàn)原理
首先最重要的,要知道我們這些是用QGraphicsView、QGraphicsScene、QGraphicsRectItem 這三個(gè)基類實(shí)現(xiàn)的
實(shí)現(xiàn)方法如下:
①Q(mào)GraphicsScene.render渲染編輯窗口獲得image,將image按照預(yù)覽窗口的比例進(jìn)行縮放并放入overView
②創(chuàng)建一個(gè)矩形框,框是按照編輯器窗口和image的比例進(jìn)行繪制的
③拖動(dòng)或者縮放預(yù)覽窗口的時(shí)候,編輯窗口按照同樣的比例移動(dòng)縮放,拖動(dòng)或者縮放預(yù)覽窗口的時(shí)候同理
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): # 框選出來(lái)的方形 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界面中的那個(gè)定位方框
②編輯界面
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、創(chuàng)建scene
2、把scene放到view
3、把item放到scene,其中這里的item是點(diǎn)也就是QGraphicsEllipseItem,也是繼承自QGraphicsRectItem
使屏幕可以拖動(dòng): self.setSceneRect(-1 << 30, -1 << 30, 1 << 31, 1 << 31),因?yàn)閟cene很大,在view里面裝不下,所以就可以拖動(dòng)啦~
**添加點(diǎn):**如上的addPoint方法
**刪除點(diǎn):**如上的mousePressEvent方法,其中self.itemAt(mouseEvent.pos())可以獲取當(dāng)前鼠標(biāo)位置是什么東西
③預(yù)覽窗口
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、創(chuàng)建scene
2、把scene放到view
3、把item放到scene,其中這里的item是點(diǎn)也就是QGraphicsRectItem,繼承自QGraphicsRectItem
3、位置同步解析
①上下兩屏位置同步、編輯屏位置保持不變
1、兩個(gè)pyqtSignal 分別去響應(yīng)上下兩個(gè)屏幕的移動(dòng)和縮放
2、scene的的左上角到當(dāng)前屏幕中心的長(zhǎng)寬來(lái)定位(主要用到scene.itemsBoundingRect()、view.mapToScene()、view.mapFromScene()這幾個(gè)方法),屏幕中心的scene位置可以通過(guò)編輯窗口長(zhǎng)寬的一半并通過(guò)view.mapToScene()來(lái)轉(zhuǎn)化
以上就是python使用PyQt制作預(yù)覽窗口游戲中的小地圖的詳細(xì)內(nèi)容,更多關(guān)于PyQt制作預(yù)覽游戲小地圖窗口的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- python編程PyQt5創(chuàng)建按鈕及觸發(fā)點(diǎn)擊事件示例解析
- python光學(xué)仿真PyQt5基礎(chǔ)框架教程
- python編程使用PyQt創(chuàng)建UE藍(lán)圖
- Python深度學(xué)習(xí)實(shí)戰(zhàn)PyQt5菜單和工具欄功能作用
- Python深度學(xué)習(xí)實(shí)戰(zhàn)PyQt5安裝與環(huán)境配置過(guò)程詳解
- Python深度學(xué)習(xí)實(shí)戰(zhàn)PyQt5基本控件使用解析
- Python深度學(xué)習(xí)實(shí)戰(zhàn)PyQt5信號(hào)與槽的連接
- python PyQt實(shí)現(xiàn)的手寫電子簽名程序?qū)嵗骄?/a>
相關(guān)文章
PyTorch搭建LSTM實(shí)現(xiàn)時(shí)間序列負(fù)荷預(yù)測(cè)
這篇文章主要為大家介紹了PyTorch搭建LSTM實(shí)現(xiàn)時(shí)間序列負(fù)荷預(yù)測(cè),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05python機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之最近鄰kNN分類器
這篇文章主要介紹了python機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之最近鄰kNN分類器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Pytorch實(shí)現(xiàn)圖像識(shí)別之?dāng)?shù)字識(shí)別(附詳細(xì)注釋)
這篇文章主要介紹了Pytorch實(shí)現(xiàn)圖像識(shí)別之?dāng)?shù)字識(shí)別(附詳細(xì)注釋),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05基于Python實(shí)現(xiàn)俄羅斯方塊躲閃小游戲
這篇文章主要為大家詳細(xì)介紹了如何基于Python實(shí)現(xiàn)有趣的俄羅斯方塊躲閃小游戲,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-04-04解決python報(bào)錯(cuò)ImportError:urllib3?v2.0?only?supports?OpenSSL
這篇文章主要介紹了解決python報(bào)錯(cuò)ImportError:urllib3?v2.0?only?supports?OpenSSL?1.1.1+的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12Python深度學(xué)習(xí)線性代數(shù)示例詳解
這篇文章主要為大家講解了Python深度學(xué)習(xí)中線性代數(shù)的示例詳解有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10數(shù)據(jù)驅(qū)動(dòng)測(cè)試DDT之Selenium讀取Excel文件
這篇文章主要為大家介紹了數(shù)據(jù)驅(qū)動(dòng)測(cè)試DDT之Selenium讀取Excel文件,2021-11-11