#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»-оператор с точками