【问题标题】:custom QGraphicsItem not moving properly自定义 QGraphicsItem 没有正确移动
【发布时间】:2020-08-31 09:10:42
【问题描述】:

我尝试自定义 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_())

【问题讨论】:

    标签: python pyqt pyqt5 qgraphicsscene qgraphicsitem


    【解决方案1】:

    boundingRect()是一个矩形,用来表示应该绘制的区域,这个区域是相对于项目的坐标系的,而不是场景的坐标系,所以你不应该使用x()y(),因为它们是相对于场景坐标进行测量的。

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

    更多信息请见Graphics View Framework

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多