创建后如何移动 Qt QPainterPath 中的点?
how can I move the points in a Qt QPainterPath after creation?
我通过向构造函数传递一个包含大约 10 个 QPoint 的 QPainterPath 创建了一个 QGraphicsPathItem。现在如何移动路径中的点?
例如:
这要创建一个框:
path = QtGui.QPainterPath()
path.moveTo(0, 0)
path.lineTo(10, 0)
path.lineTo(10, 10)
path.lineTo(0, 10)
line = QtGui.QGraphicsPathItem()
line.setPath(path)
一段时间后,我想通过抓住右上角和右下角并将它们向右移动来使这个框变宽。我怎样才能获得积分? QPainterPath 的 Qt 文档表明 path.elementAt(i)
是访问路径内数据的方式,但是 returns 一个 QElementObject 并且我找不到很多关于 "element object" 的文档,这绝对是不是 QPointF(这是我希望得到的……对吗?)。那么我怎样才能从这个元素中得到一个 QPointF 呢?一旦我得到了分数,是否可以只调用它们的 QPointF.setX()
和 QPointF.setY()
并且线条将重新绘制,或者我是否需要通过新调用将其重新设置为 QGraphicsPathItem到 line.setPath()
?
请注意,这是 PyQt4,python2.7。不过,如果你有的话,我会选择 C++ 答案,虽然我根本不懂 C++,但看起来很容易翻译。
可以通过path.elementAt(i).x
、path.elementAt(i).y
获取坐标,使用path.setElementPositionAt()
方法设置新值。
在下一节中,我将展示一个示例。
import sys
import random
from PyQt4 import QtGui, QtCore
def movePoints():
p = line.path()
for i in range(p.elementCount()):
xo, yo = p.elementAt(i).x, p.elementAt(i).y
xn, yn = (e+10*(random.random()-0.5) for e in (xo, yo))
p.setElementPositionAt(i, xn, yn)
line.setPath(p)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
w = QtGui.QGraphicsView()
scene = QtGui.QGraphicsScene(w)
w.setScene(scene)
timer = QtCore.QTimer()
timer.timeout.connect(movePoints)
path = QtGui.QPainterPath()
path.moveTo(0, 0)
path.lineTo(10, 0)
path.lineTo(10, 10)
path.lineTo(0, 10)
line = QtGui.QGraphicsPathItem()
line.setPath(path)
scene.addItem(line)
timer.start(1000)
w.show()
sys.exit(app.exec_())
如果要使用QPointF
,相当于示例的代码如下:
def movePoints():
p = line.path()
for i in range(p.elementCount()):
point = QtCore.QPointF(p.elementAt(i))
point += QtCore.QPointF(10*random.random()-5, 10*random.random()-5)
p.setElementPositionAt(i, point.x(), point.y())
line.setPath(p)
我通过向构造函数传递一个包含大约 10 个 QPoint 的 QPainterPath 创建了一个 QGraphicsPathItem。现在如何移动路径中的点?
例如:
这要创建一个框:
path = QtGui.QPainterPath()
path.moveTo(0, 0)
path.lineTo(10, 0)
path.lineTo(10, 10)
path.lineTo(0, 10)
line = QtGui.QGraphicsPathItem()
line.setPath(path)
一段时间后,我想通过抓住右上角和右下角并将它们向右移动来使这个框变宽。我怎样才能获得积分? QPainterPath 的 Qt 文档表明 path.elementAt(i)
是访问路径内数据的方式,但是 returns 一个 QElementObject 并且我找不到很多关于 "element object" 的文档,这绝对是不是 QPointF(这是我希望得到的……对吗?)。那么我怎样才能从这个元素中得到一个 QPointF 呢?一旦我得到了分数,是否可以只调用它们的 QPointF.setX()
和 QPointF.setY()
并且线条将重新绘制,或者我是否需要通过新调用将其重新设置为 QGraphicsPathItem到 line.setPath()
?
请注意,这是 PyQt4,python2.7。不过,如果你有的话,我会选择 C++ 答案,虽然我根本不懂 C++,但看起来很容易翻译。
可以通过path.elementAt(i).x
、path.elementAt(i).y
获取坐标,使用path.setElementPositionAt()
方法设置新值。
在下一节中,我将展示一个示例。
import sys
import random
from PyQt4 import QtGui, QtCore
def movePoints():
p = line.path()
for i in range(p.elementCount()):
xo, yo = p.elementAt(i).x, p.elementAt(i).y
xn, yn = (e+10*(random.random()-0.5) for e in (xo, yo))
p.setElementPositionAt(i, xn, yn)
line.setPath(p)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
w = QtGui.QGraphicsView()
scene = QtGui.QGraphicsScene(w)
w.setScene(scene)
timer = QtCore.QTimer()
timer.timeout.connect(movePoints)
path = QtGui.QPainterPath()
path.moveTo(0, 0)
path.lineTo(10, 0)
path.lineTo(10, 10)
path.lineTo(0, 10)
line = QtGui.QGraphicsPathItem()
line.setPath(path)
scene.addItem(line)
timer.start(1000)
w.show()
sys.exit(app.exec_())
如果要使用QPointF
,相当于示例的代码如下:
def movePoints():
p = line.path()
for i in range(p.elementCount()):
point = QtCore.QPointF(p.elementAt(i))
point += QtCore.QPointF(10*random.random()-5, 10*random.random()-5)
p.setElementPositionAt(i, point.x(), point.y())
line.setPath(p)