我通过向构造函数传递一个包含大约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)是访问路径内数据的方式,但是它返回QElementObject,而我找不到关于“元素对象”的太多文档,并且绝对不是QPointF(这就是我希望得到...正确吗?)。那么如何从该元素中获取QPointF?一旦获得要点,就可以调用它们的QPointF.setX()QPointF.setY()并重新绘制线条,还是需要通过重新调用line.setPath()将其重新设置为QGraphicsPathItem ?

注意,这是PyQt4,python 2.7。但是,如果您有C ++答案,尽管我一点都不了解C ++,但翻译起来似乎很容易。

最佳答案

您可以通过path.elementAt(i).xpath.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)

08-20 03:43