python 将QGraphicsItem移动到QGraphicsItemGroup位置

drkbr07n  于 2023-05-16  发布在  Python
关注(0)|答案(1)|浏览(110)

我想知道是否有一种方法可以移动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()?

euoag5mw

euoag5mw1#

这里的解决方法(基于@musicamante的解释)是取curson在场景中的位置,迭代所有我想要的节点->set.pos(screenX,screenY),然后将它们添加到具有边界矩形的组中,如下所示。

self.childrenBoundingRect().adjusted(-25, -25, 50, 50)

相关问题