python - 自定义 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_())
解决方案
是boundingRect()
一个矩形,用于指示应该绘制的区域,该区域是相对于项目的坐标系,而不是场景的坐标系,因此您不应该使用x()
或y()
因为它们是相对于场景坐标。
def boundingRect(self):
return QRectF(-10, -10, 50, 50)
有关详细信息,请参阅图形视图框架
推荐阅读
- python - Python:执行命令行时隐藏控制台
- google-cloud-platform - 谷歌云身份验证错误。用户名与 json 不匹配
- r - 如何为 R 中的密度分布建模负值?
- laravel - Laravel 获取从表单请求内爆的值数组
- android - 从另一个片段到达时对顶级目的地进行不同的处理
- python - 输入类型不支持 ufunc 'true_divide',并且输入无法安全地强制转换为任何支持的类型错误
- python - 如何使用熊猫计算另一列中每个值在一列中出现的次数?
- python - 如何计算频带的平均值(mu,8-13Hz)?
- asp.net-core - DI 多个 OpenId 提供程序 - 未为匿名路由注入用户身份
- python - 在 Python 中使用自定义距离函数对任意对象进行聚类