首页 > 解决方案 > 在 QGraphicsScene 中移动 QlineF

问题描述

我试图了解如何在 QGraphicsScene 中移动/转换图形项目。

在我的代码中,我将带有场景的 QGraphicView 定义为 QGraphicsScene。然后我用 QLineF 创建了一条线“l2”。然后我将“l2”定义为 QGraphicsItem“lnk”,并定义 pen、isSelectable 和 isMovable。我用“addItem”将它添加到场景中

后记我阅读了起点和终点,操纵终点并希望在场景中更新线。在这里我失败了。

我的代码是

self.gvCanvas.setGeometry(QtCore.QRect(20, 10, 501, 501))
self.scene = QtWidgets.QGraphicsScene()


l2 = QtCore.QLineF(100,100,300,70)
penlnk = QtGui.QPen(QtCore.Qt.black,3,QtCore.Qt.SolidLine)
lnk = QGraphicsLineItem(l2)
lnk.setPen(penlnk)
lnk.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True)
lnk.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True)
self.scene.addItem(lnk)

pt1 = l2.p1()
pt2 = l2.p2()
xpos = pt2.x()+1500
ypos = pt2.y()
ypos = ypos+500
ptnew=QtCore.QPoint(xpos,ypos)
l2 = QtCore.QLineF(pt1,ptnew) 

我尝试了“setLine(l2)”、“scene.update()”等。没有任何效果。

我可以先删除“l2”行,然后再新建。但这肯定不是正确的方法!?!

标签: pythonpython-3.xpyqtpyqt5

解决方案


QGraphicsLineItem 复制了 l2 的值,所以修改 l2 不会修改 QGraphicsLineItem,你要做的就是使用setLine()为 item 设置新行,这个方法会在内部调用该update()方法:

# ...
ptnew=QtCore.QPoint(xpos,ypos)
l2 = QtCore.QLineF(pt1,ptnew) 
lnk.setLine(l2)

您以前的代码可以简化为以下内容:

self.gvCanvas.setGeometry(QtCore.QRect(20, 10, 501, 501))
self.scene = QtWidgets.QGraphicsScene()

l2 = QtCore.QLineF(100,100,300,70)
penlnk = QtGui.QPen(QtCore.Qt.black, 3, QtCore.Qt.SolidLine)
lnk = QGraphicsLineItem(l2)
lnk.setPen(penlnk)
lnk.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True)
lnk.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True)
self.scene.addItem(lnk)
l2.setP2(l2.p2() + QtCore.QPointF(1500, 500))
lnk.setLine(l2)

推荐阅读