我想知道是否有一种方法可以移动QGraphicsItemGroup中对象的位置。
例如,我想创建一个GraphItemGroup,并在场景中分配一些坐标。然后,当事件发生时,将场景中的一些项目添加到组中,并且添加到组中的所有项目将移动到中心内。
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (
QWidget, QStyleOptionGraphicsItem,QGraphicsView,
QGraphicsScene, QGraphicsItem, QApplication, QGraphicsItemGroup,
QGraphicsEllipseItem)
import json
import math
from random import randrange
from PyQt5 import QtCore, QtGui, QtWidgets,sip
from PyQt5.QtCore import (
Qt,
QRectF,
QRect,
)
from PyQt5.QtGui import (
QPainter,
QBrush,
QPen,
QColor,
)
from PyQt5.QtWidgets import (
QApplication,
QWidget,
QGraphicsItemGroup,
QGraphicsItem
)
import time
class MyDisk(QGraphicsEllipseItem):
def __init__(self, top_left_x, top_left_y, radius, color):
super().__init__(top_left_x, top_left_y, radius, radius)
self.setBrush(color)
self.setFlag(QGraphicsItem.ItemIsMovable)
class MyGroup(QGraphicsItemGroup):
def __init__(self):
super().__init__()
self.setFlag(QGraphicsItemGroup.ItemIsMovable)
self.setFlag(QGraphicsItemGroup.ItemIsMovable)
def boundingRect(self) -> QRectF:
return QRectF(100,100,40,40)
def paint(self,
painter: QtGui.QPainter,
option: QStyleOptionGraphicsItem,
widget: QWidget = None):
painter.setPen(QtGui.QPen(QtCore.Qt.NoPen))
painter.setBrush(QtGui.QBrush(QtCore.Qt.gray))
#painter.drawRect(QRect(100,100,20,20))
r = self.boundingRect()
painter.drawRect(QRect(r.x(), r.y(), r.width(), r.height()))
class MyView(QGraphicsView):
def __init__(self):
super().__init__()
self.scene = QGraphicsScene()
self.setScene(self.scene)
self.setWindowTitle('Red disks are not movable')
self.setSceneRect(0, 0, 250, 250)
self.group = MyGroup()
self.scene.addItem(self.group)
d1 = MyDisk(0, 0, 20, Qt.green)
d2 = MyDisk(150, 50, 20, Qt.red)
d3 = MyDisk(150, 80, 20, Qt.blue)
self.scene.addItem(d1)
self.scene.addItem(d2)
self.scene.addItem(d3)
#self.group.addToGroup(d1) // not working either
#self.group.addToGroup(d2) // no working either
d2.setParentItem(self.group)
d1.setParentItem(self.group)
if __name__ == '__main__':
app = QApplication([])
f = MyView()
f.show()
sys.exit(app.exec_())
上面的代码创建对象和组。然后将项目分配到组中,但我没有看到它们在“组内”改变位置。
有没有办法做到这一点?或者我必须迭代这些项,然后->setPos()?
1条答案
按热度按时间euoag5mw1#
这里的解决方法(基于@musicamante的解释)是取curson在场景中的位置,迭代所有我想要的节点->set.pos(screenX,screenY),然后将它们添加到具有边界矩形的组中,如下所示。