【发布时间】:2023-03-05 00:05:01
【问题描述】:
在下图中,我将场景中的QGraphicsPathItem 设置为红色部分,并将其形状覆盖为蓝色部分。我想要当拖动和移动红色空间时,该项目被线性延长或缩短,当拖动蓝色空间时,必须移动整个项目。
这是我尝试过的......
import sys
from PyQt5.QtCore import QRectF, Qt, QPointF
from PyQt5.QtGui import QPainterPath, QPen, QPainterPathStroker, QPainter
from PyQt5.QtWidgets import QApplication, QMainWindow, QGraphicsScene, QGraphicsView, QGraphicsPathItem, QGraphicsItem
class Item(QGraphicsPathItem):
circle = QPainterPath()
circle.addEllipse(QRectF(-5, -5, 10, 10))
def __init__(self):
super(Item, self).__init__()
self.setPath(Item.circle)
self.setFlag(QGraphicsItem.ItemIsSelectable, True)
self.setFlag(QGraphicsItem.ItemIsMovable, True)
def paint(self, painter, option, widget):
color = Qt.red if self.isSelected() else Qt.black
painter.setPen(QPen(color, 2, Qt.SolidLine))
painter.drawPath(self.path())
# To paint path of shape
painter.setPen(QPen(Qt.blue, 1, Qt.SolidLine))
painter.drawPath(self.shape())
def shape(self):
startPoint = self.mapFromScene(self.pos())
endPoint = self.mapFromScene(QPointF(10, 10))
path = QPainterPath(startPoint)
path.lineTo(endPoint)
stroke = QPainterPathStroker()
stroke.setWidth(10)
return stroke.createStroke(path)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = QMainWindow()
window.show()
scene = QGraphicsScene()
scene.setSceneRect(0, 0, 200, 200)
view = QGraphicsView()
view.setScene(scene)
window.setCentralWidget(view)
scene.addItem(Item())
sys.exit(app.exec_())
【问题讨论】:
-
我不懂你,解释清楚你的要求
-
我有一个 qgraphicspath 项目,在图像中显示为红色圆圈,可以移动。当我在红色圆圈和场景上的固定点之间单击鼠标时,我希望 item.isSelected() 方法返回 true
-
好吧,为什么要重写 shape 方法?
-
应该改变蓝色空间的大小还是应该始终保持相同的大小?
-
正如我所说的,我已经理解你想要什么,而且我知道它为什么会失败,所以你不再说同样的话,否则 cmets 会扩展太多。最好花时间改进您的帖子,清楚地解释您想要什么。
标签: python pyqt pyqt5 qgraphicsitem qgraphicspathitem