• 大爽pyqt5笔记&教程 五 运动游戏基础 QGraphicsView 和 QGraphicsScene


    作者自我介绍:大爽歌, b站小UP主
    python1对1辅导老师
    时常直播编程,直播时免费回答简单问题。

    14 位图移动逻辑基础实现

    运动游戏的核心基础是,通过按键能够实现图片的运动(比如上下左右移动)。

    虽然使用QLabel也能够展示图片,并且通过setGeometory也能设定位置,但是这样处理运动并不友好。

    更推荐使用QGraphicsViewQGraphicsScene

    QGraphicsView和QGraphicsScene

    这两个要一般要一起配合使用。
    其中QGraphicsView作为控件,占据面板一片区域。
    QGraphicsScene则作为场景,用于添加位图项目。

    基础代码如下

    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import QPixmap
    from PyQt5.QtCore import *
    
    import sys
    
    
    class MyWindow(QWidget):
        def __init__(self):
            super(MyWindow, self).__init__()
            self.resize(300, 200)
            self.init_gui()
    
            self.show()
    
        def init_gui(self):
            box = QVBoxLayout()
            label = QLabel("Basic Move", self)
    
            self.view = QGraphicsView()
            self.scene = QGraphicsScene()
            self.view.setScene(self.scene)
    
            box.addWidget(label)
            box.addWidget(self.view)
    
            self.setLayout(box)
    

    效果如图

    注意这几行

    self.view = QGraphicsView()
    self.scene = QGraphicsScene()
    self.view.setScene(self.scene)
    
    box.addWidget(self.view)
    
    • QGraphicsView使用QGraphicsScene作为场景
    • QGraphicsView可以看作控件添加到上级的layout中。

    动画区域要添加运动的图片,则是QGraphicsScene来添加。
    比如添加一个图片,且实现基础的移动功能。

    此时里面的位图要使用QGraphicsPixmapItem控件来展示。

    添加图片与运动

    添加图片和响应键盘操作运动。
    可以在MyWindow类添加如下方法

    def set_view(self):
        self.item = QGraphicsPixmapItem()  # 新建QGraphicsPixmapItem对象用于显示图片
        self.item.setPixmap(QPixmap("my_logo.png"))  # 设置位图
        self.item.setPos(100, 100)  # 设置图片位置
        self.scene.addItem(self.item)  # 添加图片到scene中
    
        self.view.setFixedSize(300, 300)  # 设置view为固定尺寸 300x300
        self.view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) # 关闭水平方向滚动条
        self.view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)  # 关闭竖直方向滚动条
    
    def keyPressEvent(self, event):
        if event.key() == Qt.Key_W:  # 按W键上移
            self.item.setPos(self.item.x(), self.item.y()-10)
        elif event.key() == Qt.Key_S:  # 按S键上移
            self.item.setPos(self.item.x(), self.item.y()+10)
        elif event.key() == Qt.Key_A:  # 按A键左移
            self.item.setPos(self.item.x()-10, self.item.y())
        elif event.key() == Qt.Key_D:  # 按D键右移
            self.item.setPos(self.item.x()+10, self.item.y())
    

    且在init_gui方法中(末尾处)添加一句代码

    self.set_view()
    

    此时效果如图

    此时按方向键就可以移动图片了。

    总代码

    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import QPixmap
    from PyQt5.QtCore import *
    
    import sys
    
    
    class MyWindow(QWidget):
        def __init__(self):
            super(MyWindow, self).__init__()
            self.resize(300, 200)
            self.init_gui()
    
            self.show()
    
        def init_gui(self):
            box = QVBoxLayout()
            label = QLabel("Label Text", self)
    
            self.view = QGraphicsView()
            self.scene = QGraphicsScene()
            self.view.setScene(self.scene)
    
            box.addWidget(label)
            box.addWidget(self.view)
    
            self.set_view()
            self.setLayout(box)
    
        def set_view(self):
            self.item = QGraphicsPixmapItem()  # 新建QGraphicsPixmapItem对象用于显示图片
            self.item.setPixmap(QPixmap("my_logo.png"))  # 设置位图
            self.item.setPos(100, 100)  # 设置图片位置
            self.scene.addItem(self.item)  # 添加图片到scene中
    
            self.view.setFixedSize(300, 300)  # 设置view为固定尺寸 300x300
            self.view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) # 关闭水平方向滚动条
            self.view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)  # 关闭竖直方向滚动条
    
        def keyPressEvent(self, event):
            if event.key() == Qt.Key_W:  # 按W键上移
                self.item.setPos(self.item.x(), self.item.y()-10)
            elif event.key() == Qt.Key_S:  # 按S键上移
                self.item.setPos(self.item.x(), self.item.y()+10)
            elif event.key() == Qt.Key_A:  # 按A键左移
                self.item.setPos(self.item.x()-10, self.item.y())
            elif event.key() == Qt.Key_D:  # 按D键右移
                self.item.setPos(self.item.x()+10, self.item.y())
    
    
    app = QApplication(sys.argv)
    win = MyWindow()
    sys.exit(app.exec_())
    
  • 相关阅读:
    在ubuntu 12.04 中配置java环境(安装jdk, tomcat, maven, eclipse)
    java 对EXCEL表格的处理
    JAVA下载文件中文乱码问题
    Java 判断文件夹、文件是否存在、否则创建文件夹
    jspSmartUpload上传下载全攻略
    intellJ实用技巧
    main 方法,
    老师,有没有类似微信布局的好的开源库?
    Android 日常开发总结的技术经验 60 条
    新的android studio创建的fragment工程跟老师讲的结构有区别
  • 原文地址:https://www.cnblogs.com/BigShuang/p/15564228.html
Copyright © 2020-2023  润新知