gpt4 book ai didi

PyQt:QGraphicsItem 添加在错误的位置

转载 作者:行者123 更新时间:2023-12-05 08:58:56 25 4
gpt4 key购买 nike

我有一个 QGraphicsItem 的子类,我想通过“Control+LMB click”将它的实例添加到场景中。问题是项目被添加到坐标比它们应该大两倍的位置。同时使用 scene.addEllipse(...) 添加椭圆效果很好。

#!/usr/bin/env python

import sys
from PyQt4.QtCore import (QPointF, QRectF, Qt, )
from PyQt4.QtGui import (QApplication, QMainWindow, QGraphicsItem,
QGraphicsScene, QGraphicsView, QPen, QStyle)

MapSize = (512, 512)

class DraggableMark(QGraphicsItem):
def __init__(self, position, scene):
super(DraggableMark, self).__init__(None, scene)
self.setFlags(QGraphicsItem.ItemIsSelectable | QGraphicsItem.ItemIsMovable)
self.rect = QRectF(position.x(), position.y(), 15, 15)
self.setPos(position)
scene.clearSelection()

def boundingRect(self):
return self.rect

def paint(self, painter, option, widget):
pen = QPen(Qt.SolidLine)
pen.setColor(Qt.black)
pen.setWidth(1)
if option.state & QStyle.State_Selected:
pen.setColor(Qt.blue)
painter.setPen(pen)
painter.drawEllipse(self.rect)


class GraphicsScene(QGraphicsScene):
def __init__(self, parent=None):
super(GraphicsScene, self).__init__(parent)
self.setSceneRect(0, 0, *MapSize)

def mousePressEvent(self, event):
super(GraphicsScene, self).mousePressEvent(event)
if event.button() != Qt.LeftButton:
return

modifiers = QApplication.keyboardModifiers()
pos = event.scenePos()
if modifiers == Qt.ControlModifier:
print("Control + Click: (%d, %d)" % (pos.x(), pos.y()))
DraggableMark(pos, self)
self.addEllipse(QRectF(pos.x(), pos.y(), 10, 10))
else:
print("Click: (%d, %d)" % (pos.x(), pos.y()))


class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.scene = GraphicsScene(self)
self.scene.addRect(QRectF(0, 0, *MapSize), Qt.red)
self.view = QGraphicsView()
self.view.setScene(self.scene)
self.view.resize(self.scene.width(), self.scene.height())
self.setCentralWidget(self.view)


if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
rect = QApplication.desktop().availableGeometry()
window.resize(int(rect.width()), int(rect.height()))
window.show()
app.exec_()

最佳答案

我看到你已经回答了你自己的问题。不过,我想解释一下为什么这是可行的。

每个 QGraphicsItem有自己的局部坐标系。所以当你这样做的时候

self.rect = QRectF(position.x(), position.y(), 15, 15)

你基本上是从(0, 0)开始的项目的局部坐标系并转到给定的 xy你取自 position .这基本上意味着您的矩形将绘制在 position.x() + position.x() 处。和 position.y() + position.y()第一个position.x()/position.y()作为 QGraphicsItem 的位置在你的场景中,第二个 position.x()/position.y()是您项目的局部坐标系内的位置。

如果要从QGraphicsItem的原点开始,你必须使用

 self.rect = QRectF(0, 0, 15, 15)

这确保您从本地坐标系的原点开始。

这个问题特别棘手,因为默认情况下对象被添加到 (0, 0)的一个场景。所以position.x() + position.x()position.y() + position.y()在这种情况下,实际上不会显示手头的问题,因为 0+0始终等于 0 .当您将默认位置更改为其他位置时,就会出现问题。

这是一个可视化我上面描述的内容的 3D 图(我无法找到 2D 示例,但原理是相同的 :P):

enter image description here

world这是 object 时的场景是QGraphicsItem住在那个scene .

关于PyQt:QGraphicsItem 添加在错误的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19121309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com