переместить QlineF внутрь QGraphicsScene - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь понять, как перемещать / преобразовывать графические элементы внутри 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 Ответ

0 голосов
/ 06 марта 2019

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...