最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年10月28日 16:00:09   作者:在逆境中蛻變  
這篇文章主要為大家介紹了python使用PyQt制作預(yù)覽窗口游戲中的小地圖實現(xiàn)示例過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步

寫作思路

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

在這里插入圖片描述

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

版本2:

在這里插入圖片描述

在版本1的基礎(chǔ)上,加入了點的刪除和增加,并對畫布進行了擴展,同時保持編輯界面的畫面位置不變

1、簡述實現(xiàn)原理

首先最重要的,要知道我們這些是用QGraphicsView、QGraphicsScene、QGraphicsRectItem 這三個基類實現(xiàn)的
實現(xiàn)方法如下:
①Q(mào)GraphicsScene.render渲染編輯窗口獲得image,將image按照預(yù)覽窗口的比例進行縮放并放入overView
②創(chuàng)建一個矩形框,框是按照編輯器窗口和image的比例進行繪制的
③拖動或者縮放預(yù)覽窗口的時候,編輯窗口按照同樣的比例移動縮放,拖動或者縮放預(yù)覽窗口的時候同理

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、創(chuàng)建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())可以獲取當(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是點也就是QGraphicsRectItem,繼承自QGraphicsRectItem

3、位置同步解析

①上下兩屏位置同步、編輯屏位置保持不變

1、兩個pyqtSignal 分別去響應(yīng)上下兩個屏幕的移動和縮放
2、scene的的左上角到當(dāng)前屏幕中心的長寬來定位(主要用到scene.itemsBoundingRect()、view.mapToScene()、view.mapFromScene()這幾個方法),屏幕中心的scene位置可以通過編輯窗口長寬的一半并通過view.mapToScene()來轉(zhuǎn)化

以上就是python使用PyQt制作預(yù)覽窗口游戲中的小地圖的詳細內(nèi)容,更多關(guān)于PyQt制作預(yù)覽游戲小地圖窗口的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python中?whl包、tar.gz包的區(qū)別詳解

    Python中?whl包、tar.gz包的區(qū)別詳解

    whl格式本質(zhì)上是一個壓縮包,里面包含了py文件,以及經(jīng)過編譯的pyd文件,這篇文章主要介紹了Python中?whl包、tar.gz包的區(qū)別,需要的朋友可以參考下
    2022-08-08
  • 詳解如何使用Python實現(xiàn)過濾指定進程

    詳解如何使用Python實現(xiàn)過濾指定進程

    Python提供了多種方式來實現(xiàn)對進程的過濾和操作,本文將介紹如何利用Python來過濾指定進程,并展示一些實用的技巧和方法,希望對大家有所幫助
    2024-04-04
  • python如何將圖片轉(zhuǎn)換為字符圖片

    python如何將圖片轉(zhuǎn)換為字符圖片

    這篇文章主要為大家詳細介紹了python將圖片轉(zhuǎn)換為字符圖片的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 關(guān)于Python中Flask全局異常處理流程詳解

    關(guān)于Python中Flask全局異常處理流程詳解

    Flask是一個基于Python的Web框架,它提供了全局異常處理的機制來捕獲和處理應(yīng)用程序中的異常,本文將詳細介紹Flask的全局異常處理,并提供相應(yīng)的代碼示例,需要的朋友可以參考下
    2023-06-06
  • opencv python在視屏上截圖功能的實現(xiàn)

    opencv python在視屏上截圖功能的實現(xiàn)

    OpenCV是一個基于BSD許可(開源)發(fā)行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS操作系統(tǒng)上。這篇文章主要介紹了opencv python在視屏上截圖,需要的朋友可以參考下
    2020-03-03
  • Python?Serial串口的簡單數(shù)據(jù)收發(fā)方式

    Python?Serial串口的簡單數(shù)據(jù)收發(fā)方式

    這篇文章主要介紹了Python?Serial串口的簡單數(shù)據(jù)收發(fā)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python post請求實現(xiàn)代碼實例

    Python post請求實現(xiàn)代碼實例

    這篇文章主要介紹了Python post請求實現(xiàn)代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • Python urlopen()和urlretrieve()用法解析

    Python urlopen()和urlretrieve()用法解析

    這篇文章主要介紹了Python urlopen()和urlretrieve()用法解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • 詳細介紹Python進度條tqdm的使用

    詳細介紹Python進度條tqdm的使用

    這篇文章主要介紹了詳細介紹Python進度條tqdm的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python入門篇之編程習(xí)慣與特點

    Python入門篇之編程習(xí)慣與特點

    本文是Python入門篇的第一篇文章,主要講述了Python編程習(xí)慣和特點等一些基礎(chǔ)知識,有需要的朋友可以參考下
    2014-10-10

最新評論

百色市| 甘谷县| 兰考县| 体育| 濮阳市| 阳新县| 革吉县| 安阳县| 通化县| 平阴县| 普定县| 额敏县| 宜昌市| 武山县| 张北县| 阳春市| 昌江| 吉安县| 玉环县| 无为县| 衡东县| 九江县| 大庆市| 前郭尔| 北碚区| 龙南县| 神池县| 阜康市| 怀化市| 鄂托克前旗| 卓资县| 伊吾县| 北宁市| 乐业县| 吴江市| 兴文县| 赞皇县| 射洪县| 麦盖提县| 青神县| 福海县|