1

我通过向构造函数传递一个包含大约 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()该线将重新绘制,或者我是否需要通过新的调用将其重新设置为 QGraphicsPathItem line.setPath()

请注意,这是 PyQt4,python 2.7。但是,如果您有 C++ 答案,我会接受它,尽管我根本不懂 C++,但它似乎很容易翻译。

4

1 回答 1

2

可以通过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)
于 2018-04-14T04:54:15.663 回答