首页 > 解决方案 > 自定义 QGraphicsItem 没有正确移动

问题描述

我尝试自定义 QGraphicsItem 以制作一个可移动的棋子,但在掉落时会以箱子为中心(模拟跳棋或棋盘)

我在一开始就遇到了一个问题,因为我的自定义图形项目无法正确移动,当拖动它时会留下痕迹并且对象消失

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QGridLayout,
                         QGraphicsView, QGraphicsScene, QGraphicsItem)
from PyQt5.QtGui import QPen, QBrush, QTransform
from PyQt5.QtCore import Qt, QRectF, QPointF

class Pawn(QGraphicsItem):
    def __init__(self, parent = None):
        super().__init__(parent)
        self.setFlag(QGraphicsItem.ItemIsMovable)

    def paint(self, painter, options, widget):
        painter.drawEllipse(0, 0, 30, 30)

    def boundingRect(self):
        return QRectF(self.x() - 10, self.y() - 10, 50, 50)


class MainWin(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        scene = QGraphicsScene()
        view = QGraphicsView(scene, self)
        view.setGeometry(0, 0, 290, 290)

        ellipse = scene.addEllipse(200, 200, 20, 20, QPen(Qt.yellow), QBrush(Qt.yellow))
        custom = Pawn()
        scene.addItem(custom)

        ellipse.setFlag(QGraphicsItem.ItemIsMovable)

        self.setWindowTitle('doodling')
        self.setGeometry(200, 200, 300, 300)
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWin()
    sys.exit(app.exec_())

标签: pythonpyqtpyqt5qgraphicssceneqgraphicsitem

解决方案


boundingRect()一个矩形,用于指示应该绘制的区域,该区域是相对于项目的坐标系,而不是场景的坐标系,因此您不应该使用x()y()因为它们是相对于场景坐标。

def boundingRect(self):
    return QRectF(-10, -10, 50, 50)

有关详细信息,请参阅图形视图框架


推荐阅读