Как я могу переместить точки в 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)