переместить QLineF внутри QGraphicsScene

#python #python-3.x #pyqt #pyqt5

#python #python-3.x #pyqt #pyqt5

Вопрос:

Я пытаюсь понять, как перемещать / преобразовывать графические элементы внутри QGraphicsScene.

В моем коде я определяю QGraphicView со сценой как QGraphicsScene. Затем я создаю строку «l2» с QLineF. Затем я определяю «l2» как QGraphicsItem «lnk» и определяю pen, isSelectable и isMovable. Я добавляю его в сцену с помощью «addItem»

Послесловия Я читаю начало и конечную точку, манипулирую конечной точкой и хочу, чтобы строка была обновлена в сцене. Здесь я терплю неудачу.

Мой код

 self.gvCanvas.setGeometry(QtCore.QRect(20, 10, 501, 501))
self.scene = QtWidgets.QGraphicsScene()


l2 = QtCore.QLineF(100,100,300,70)
penlnk = QtGui.QPen(QtCore.Qt.black,3,QtCore.Qt.SolidLine)
lnk = QGraphicsLineItem(l2)
lnk.setPen(penlnk)
lnk.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True)
lnk.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True)
self.scene.addItem(lnk)

pt1 = l2.p1()
pt2 = l2.p2()
xpos = pt2.x() 1500
ypos = pt2.y()
ypos = ypos 500
ptnew=QtCore.QPoint(xpos,ypos)
l2 = QtCore.QLineF(pt1,ptnew) 
  

Я пробовал «setLine (l2)», «scene.update()» и другие. Ничего не работает.

Я мог бы сначала удалить строку «l2», а затем создать ее новой. Но это точно неправильный способ !?!

Ответ №1:

QGraphicsLineItem копирует значение l2, поэтому модификация l2 не изменит QGraphicsLineItem, что вы должны сделать, это установить новую строку для элемента с помощью setLine(), этот метод вызовет update() метод внутри:

 # ...
ptnew=QtCore.QPoint(xpos,ypos)
l2 = QtCore.QLineF(pt1,ptnew) 
lnk.setLine(l2)
  

Ваш предыдущий код может быть сокращен до следующего:

 self.gvCanvas.setGeometry(QtCore.QRect(20, 10, 501, 501))
self.scene = QtWidgets.QGraphicsScene()

l2 = QtCore.QLineF(100,100,300,70)
penlnk = QtGui.QPen(QtCore.Qt.black, 3, QtCore.Qt.SolidLine)
lnk = QGraphicsLineItem(l2)
lnk.setPen(penlnk)
lnk.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True)
lnk.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True)
self.scene.addItem(lnk)
l2.setP2(l2.p2()   QtCore.QPointF(1500, 500))
lnk.setLine(l2)
  

Комментарии:

1. спасибо, это работает! (и спасибо за «oneline»-оператор с точками