簡體   English   中英

在有限區域內移動矩形

[英]move rectangle in limited area

在graphicsscene上有一個roundrect,我正在嘗試移動,但是當它到達屏幕任何一側的“盡頭”時,它就會移出屏幕,但它不應移出屏幕外,它應該像被稱為“蛇妖”的游戲那樣移動”

from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget, QGraphicsView, QGraphicsScene, QGraphicsItem
from PyQt5.QtCore import Qt, QRectF
from PyQt5.QtGui import QBrush, QColor
import sys


class GraphicsItem(QGraphicsItem):
    def __init__(self, parent):
        super().__init__()
        self.setFlag(QGraphicsItem.ItemIsFocusable)
        self.setFocus()
        self.screenSize = QDesktopWidget().screenGeometry(0)
        self.screenHeight = self.screenSize.height()
        self.screenWidth = self.screenSize.width()

    def boundingRect(self):
        return QRectF(0, 0, self.screenWidth, self.screenHeight)

    def paint(self, painter, option, widget):
        painter.setBrush(QBrush(Qt.magenta))
        painter.drawRoundedRect(10, 10, 70, 70, 5, 5)
        # painter.drawEllipse(10, 100, 70, 70)

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Right:
            self.moveBy(10, 0)
        elif event.key() == Qt.Key_Left:
            self.moveBy(-10, 0)
        elif event.key() == Qt.Key_Down:
            self.moveBy(0, 10)
        elif event.key() == Qt.Key_Up:
            self.moveBy(0, -10)
        self.update()



class GraphicsScene(QGraphicsScene):
    def __init__(self, parent):
        super().__init__(parent=parent)
        graphicsitem = GraphicsItem(self)
        self.addItem(graphicsitem)
        self.setBackgroundBrush(QColor(10, 155, 79))
        self.screenSize = QDesktopWidget().screenGeometry(0)
        self.screenHeight = self.screenSize.height()
        self.screenWidth = self.screenSize.width()


class GraphicsView(QGraphicsView):
    def __init__(self, parent):
        super().__init__(parent=parent)
        graphicsscene = GraphicsScene(self)
        self.screenSize = QDesktopWidget().screenGeometry(0)
        self.screenHeight = self.screenSize.height()
        self.screenWidth = self.screenSize.width()
        self.setGeometry(0, 0, self.screenWidth, self.screenHeight)
        self.setScene(graphicsscene)
        self.show()


class Widget(QWidget):
    def __init__(self):
        super().__init__()
        graphicsview = GraphicsView(self)
        self.screenSize = QDesktopWidget().screenGeometry(0)
        self.screenHeight = self.screenSize.height()
        self.screenWidth = self.screenSize.width()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("Graphics View")
        self.setGeometry(0, 0, self.screenWidth, self.screenHeight)
        self.show()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    widget = Widget()
    sys.exit(app.exec_())

試試吧:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget, QGraphicsView, QGraphicsScene, QGraphicsItem
from PyQt5.QtCore import Qt, QRectF
from PyQt5.QtGui import QBrush, QColor


class GraphicsItem(QGraphicsItem):
    def __init__(self, parent):
        super().__init__()
        self.setFlag(QGraphicsItem.ItemIsFocusable)
        self.setFocus()
        self.screenSize = QDesktopWidget().screenGeometry(0)
        self.screenHeight = self.screenSize.height()
        self.screenWidth = self.screenSize.width()

    def boundingRect(self):
        self.posX = self.pos().x()                                       # +++
        self.posY = self.pos().y()                                       # +++
        return QRectF(0, 0, self.screenWidth, self.screenHeight)

    def paint(self, painter, option, widget):
        painter.setBrush(QBrush(Qt.magenta))
        painter.drawRoundedRect(10, 10, 70, 70, 5, 5)
        # painter.drawEllipse(10, 100, 70, 70)

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Right:
#            self.moveBy(10, 0)
            if self.posX >= 1270: self.moveBy(-1270, 0)                  # +++
            else: self.moveBy(10, 0)                                     # +++
        elif event.key() == Qt.Key_Left:
#            self.moveBy(-10, 0)
            if self.posX > 0: self.moveBy(-10, 0)                        # +++
            else: self.moveBy(1270, 0)                                   # +++
        elif event.key() == Qt.Key_Down:
#            self.moveBy(0, 10)
            if self.posY >= 670: self.moveBy(0, -670)                    # +++
            else: self.moveBy(0, 10)                                     # +++
        elif event.key() == Qt.Key_Up:
#            self.moveBy(0, -10)
            if self.posY > 0: self.moveBy(0, -10)                        # +++
            else: self.moveBy(0, 670)                                    # +++

#        self.update()


class GraphicsScene(QGraphicsScene):
    def __init__(self, parent):
        super().__init__(parent=parent)

        graphicsitem = GraphicsItem(self)

        self.addItem(graphicsitem)
        self.setBackgroundBrush(QColor(10, 155, 79))
        self.screenSize = QDesktopWidget().screenGeometry(0)
        self.screenHeight = self.screenSize.height()
        self.screenWidth = self.screenSize.width()


class GraphicsView(QGraphicsView):
    def __init__(self, parent):
        super().__init__(parent=parent)

        graphicsscene = GraphicsScene(self)

        self.screenSize   = QDesktopWidget().screenGeometry(0)
        self.screenHeight = self.screenSize.height()
        self.screenWidth  = self.screenSize.width()
        self.setGeometry(0, 0, self.screenWidth, self.screenHeight)
        self.setScene(graphicsscene)
#        self.show()


class Widget(QWidget):
    def __init__(self):
        super().__init__()

        graphicsview = GraphicsView(self)

        self.screenSize = QDesktopWidget().screenGeometry(0)
        self.screenHeight = self.screenSize.height()
        self.screenWidth = self.screenSize.width()

        self.initUI()

        self.setFixedSize(self.screenWidth, self.screenHeight)           # +++

    def initUI(self):
        self.setWindowTitle("Graphics View")
        self.setGeometry(0, 0, self.screenWidth, self.screenHeight)
#        self.show()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    widget = Widget()
    widget.show()
    sys.exit(app.exec_())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM