Как я могу переместить точки в Qt QPainterPath после создания?

Я создал QGraphicsPathItem, передав конструктору QPainterPath с примерно 10 QPoint в нем. Теперь, как я могу переместить точки на пути вокруг?

Например:

Это для создания коробки:

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)

Теперь, по прошествии некоторого времени, я хочу расширить эту рамку, взяв верхнюю и нижнюю правые точки и переместив их вправо. Как я могу получить доступ к точкам? Документация Qt для QPainterPath указывает, что path.elementAt(i) это способ получить доступ к данным внутри пути, но это возвращает QElementObject, и я не смог найти много документации для "объекта элемента", и это определенно не QPointF (что я и ожидал бы получить... правильно?). Итак, как я могу получить QPointF из этого элемента? И как только я получу очки, это нормально, просто позвонить их QPointF.setX() а также QPointF.setY() и линия будет перерисована, или мне нужно переустановить ее на QGraphicsPathItem с новым вызовом line.setPath()?

Как примечание, это PyQt4, python 2.7. Однако я возьму ответ на C++, если он у вас есть, хотя я совсем не знаю C++, его довольно просто перевести.

1 ответ

Решение

Вы можете получить координаты через 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)
Другие вопросы по тегам