Python 如何在pyqt5中复制粘贴Qgraphicsitem?

Python 如何在pyqt5中复制粘贴Qgraphicsitem?,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我在场景中复制粘贴QGraphicsitem时遇到问题。 我尝试了以下代码,但它不能正常工作。 如果我尝试粘贴该项目,则第一个实例就是粘贴正确。对于第二个实例,它将删除第一个实例项并粘贴第二个实例 到目前为止,我已尝试在“复制”操作中获取项目的路径,并在“粘贴”操作中将其添加到场景中 @位置2是我的网格位置 我只想将复制的项目粘贴n次,直到复制新项目为止。如果我以错误的方式进行复制粘贴,请更正 from PyQt5.QtCore import (QByteArray, QDataStream,

我在场景中复制粘贴QGraphicsitem时遇到问题。 我尝试了以下代码,但它不能正常工作。 如果我尝试粘贴该项目,则第一个实例就是粘贴正确。对于第二个实例,它将删除第一个实例项并粘贴第二个实例

到目前为止,我已尝试在“复制”操作中获取项目的路径,并在“粘贴”操作中将其添加到场景中

@位置2是我的网格位置

我只想将复制的项目粘贴n次,直到复制新项目为止。如果我以错误的方式进行复制粘贴,请更正

from PyQt5.QtCore import (QByteArray, QDataStream, QIODevice, QMimeData, QPointF, QPoint, Qt, QRect,QTimer,QLineF, QEvent,QRectF)
from PyQt5.QtGui import QColor, QDrag, QPainter, QPixmap,QFont,QFontMetrics,QBrush, QLinearGradient, QIcon, QPen, QPainterPath, QTransform,QCursor,QMouseEvent,QClipboard
from PyQt5.QtWidgets import QApplication,QGraphicsTextItem,QGraphicsItemGroup, QSizePolicy, QScrollArea, QPushButton,QLineEdit, QMainWindow,QInputDialog, QGraphicsPathItem,QDialog, QVBoxLayout,QGraphicsItem,QStatusBar,QTextEdit, QAction,QMenu, qApp,QSplitter, QButtonGroup, QToolButton, QFrame, QHBoxLayout, QGraphicsView, QGraphicsItem, QGraphicsPixmapItem, QLabel, QGraphicsScene, QWidget
class GraphicsSceneClass(QGraphicsScene):
    global selectedObjType
    def __init__(self, parent=None):
        super(GraphicsSceneClass, self).__init__(parent)

        self.setSceneRect(0, 0, 1920, 1080)
        self.setItemIndexMethod(QGraphicsScene.NoIndex)
        self.setBackgroundBrush(QBrush(Qt.black))

    def mousePressEvent(self, event):
            sampleTransform = QTransform()
            objectAtMouse = self.itemAt(event.scenePos(), sampleTransform)

            if objectAtMouse and event.button()== Qt.LeftButton:
                objectAtMouse.setSelected(True)

            elif objectAtMouse==None and event.button()==Qt.RightButton:
                self.grid = self.TargPosForLine(event.scenePos(), "ForLine")
    def TargPosForLine(self, position, mode):

        clicked_column = int((position.y() // 16)) * 16
        clicked_row = int((position.x() // 16)) * 16
        if clicked_column < 0:
            clicked_column = 0
        if clicked_row < 0:
            clicked_row = 0
        if(mode == "ForRect"):
            return QRect(clicked_row, clicked_column,16,16)
        elif(mode == "ForLine"):
            return QPointF(clicked_row,clicked_column)
class MainWindow(QMainWindow):
    global selectedObjType
    # global item
    def __init__(self,):
        super(MainWindow, self).__init__()
        self.scene = GraphicsSceneClass()
        MainWindow.obj = self.scene
        self.view = QGraphicsView(self.scene)
        self.view.setMouseTracking(True)
        self.view.setRenderHint(QPainter.HighQualityAntialiasing)
        self.widg = QWidget()
        self.horizontalLayout = QHBoxLayout()
        self.horizontalLayout.addWidget(self.view)
        self.widg.setMouseTracking(True)
        self.widget = QWidget()
        self.widget.setLayout(self.horizontalLayout)
        self.setCentralWidget(self.widget)
        self.obj=None

    def contextMenuEvent(self, event):
        contextMenu = QMenu(self)

        Cutaction = contextMenu.addAction("Cut")
        Coaction = contextMenu.addAction("Copy")
        Paaction = contextMenu.addAction("Paste")
        Propaction = contextMenu.addAction("draw")
        quitAct = contextMenu.addAction("quit")
        action = contextMenu.exec_(self.mapToGlobal(event.pos()))
        if action == quitAct:
            self.close()
        elif action == Propaction:
            painterPath = QPainterPath()

            painterPath.moveTo(10, 50.0)
            painterPath.lineTo(50,50)
            painterPath.lineTo(50,55)
            painterPath.lineTo(10,55)
            gradient = QLinearGradient(1, 1, 1, 5)
            gradient.setColorAt(0, QColor(Qt.gray))
            gradient.setColorAt(0.5, QColor(192, 192, 192, 255))
            gradient.setColorAt(1, QColor(Qt.darkGray))
            painterPath.closeSubpath()

            objectDrop = QGraphicsPathItem()
            objectDrop.setPath(painterPath)
            objectDrop.setBrush(QBrush(gradient))
            self.scene.addItem(objectDrop)
            objectDrop.setFlag(QGraphicsItem.ItemIsSelectable)
            objectDrop._type1="line"
            # self.scene.addPath(painterPath)


        elif action == Coaction:
            self.copy()
        elif action == Paaction:
            self.paste()

    def copy(self):
        item = self.selectedItem()
        self.dragObject = item
        x = str(self.dragObject._type1)
        if item is None:
            return
        if 'text' in x:
            self.object = QGraphicsPixmapItem(item.pixmap())
        else:

            self.object = QGraphicsPathItem(item.path())
            gradient = QLinearGradient(1, 1, 1, 5)
            gradient.setColorAt(0, QColor(Qt.gray))
            gradient.setColorAt(0.5, QColor(192, 192, 192, 255))
            gradient.setColorAt(1, QColor(Qt.darkGray))
            self.object.setBrush(QBrush(gradient))
            self.object.setPen(QPen(Qt.NoPen))
            self.object._type1 = item._type1


    def paste(self):
        self.scene.addItem(self.object)
        self.object.setPos(self.scene.grid.x(), self.scene.grid.y())


    def selectedItem(self):
        items = self.scene.selectedItems()

        if len(items) == 1:
            return items[0]
        return None
if __name__=="__main__":
    import sys
    app=QApplication(sys.argv)
    mainWindow = MainWindow()

    mainWindow.show()

    sys.exit(app.exec_())
从PyQt5.QtCore导入(QByteArray、QDataStream、QIODevice、qimedata、QPointF、QPoint、Qt、QRect、QTimer、QLineF、QEvent、QRect)
从PyQt5.QtGui导入QColor、QDrag、qpaint、QPixmap、QFont、QFontMetrics、QBrush、QLinearGradient、QIcon、QPen、QPainterPath、QTransform、QCursor、QMouseEvent、QClipboard
从PyQt5.QtWidgets导入QApplication、QGraphicsTextItem、QGraphicsSiteMgroup、QSizePolicy、Qscrollara、QPushButton、QLineEdit、QMainWindow、QInputDialog、QGraphicsPathItem、QDialog、QVBoxLayout、QGraphicsSitem、QStatusBar、QTextEdit、QAction、QMenu、qApp、QSplitter、QButtonGroup、QToolButton、QFrame、QHBoxLayout、QGraphicsView、QgraphicsSitem、,QGraphicsPixmapItem、QLabel、qgraphicscene、QWidget
类别GraphicsCeneClass(QGraphicsCene):
全局选择对象类型
def uuu init uuu(self,parent=None):
super(graphicsceneclass,self)。\uuuu init\uuuu(父级)
自安装(0,0,1920,1080)
self.setItemIndexMethod(qgraphicscene.NoIndex)
自复位接地刷(QBrush(Qt.黑色))
def鼠标压力事件(自身、事件):
sampleTransform=QTransform()
objectAtMouse=self.itemAt(event.scenePos(),sampleTransform)
如果objectAtMouse和event.button()==Qt.LeftButton:
objectAtMouse.setSelected(True)
elif objectAtMouse==无,event.button()==Qt.RightButton:
self.grid=self.TargPosForLine(event.scenePos(),“ForLine”)
def TargPosForLine(自身、位置、模式):
单击了_column=int((position.y()//16))*16
单击了_row=int((position.x()//16))*16
如果单击“U”列<0:
单击了\u列=0
如果单击“行<0”:
单击的行=0
如果(模式==“ForRect”):
返回QRect(单击的行,单击的列,16,16)
elif(模式==“ForLine”):
返回QPointF(单击的行、单击的列)
类主窗口(QMainWindow):
全局选择对象类型
#全局项
定义初始值(self,):
超级(主窗口,自我)。\uuuu初始化
self.scene=graphicsceneclass()
MainWindow.obj=self.scene
self.view=QGraphicsView(self.scene)
self.view.setMouseTracking(True)
self.view.setRenderInt(QPaint.HighQuality抗锯齿)
self.widg=QWidget()
self.horizontalLayout=QHBoxLayout()
self.horizontalLayout.addWidget(self.view)
self.widg.setMouseTracking(True)
self.widget=QWidget()
self.widget.setLayout(self.horizontalLayout)
self.setCentralWidget(self.widget)
self.obj=None
def contextMenuEvent(自身、事件):
contextMenu=QMenu(自身)
Cutaction=contextMenu.addAction(“剪切”)
Coaction=contextMenu.addAction(“复制”)
Paaction=contextMenu.addAction(“粘贴”)
ProAction=contextMenu.addAction(“绘制”)
quitAct=contextMenu.addAction(“退出”)
action=contextMenu.exec(self.mapToGlobal(event.pos()))
如果动作==退出动作:
self.close()
elif action==ProAction:
painterPath=QPainterPath()
painterPath.moveTo(10,50.0)
画家路径lineTo(50,50)
画家路径lineTo(50,55)
画家路径lineTo(10,55)
梯度=QLinearGradient(1,1,1,5)
渐变色设置颜色(0,QColor(Qt.灰色))
渐变色设置颜色(0.5,QColor(192,192,192,255))
渐变色设置色(1,QColor(Qt.darkGray))
painterPath.closeSubpath()的
objectDrop=QGraphicsPathItem()
setPath(painterPath)
objectDrop.setBrush(QBrush(渐变))
self.scene.addItem(objectDrop)
objectDrop.setFlag(QGraphicsItem.ItemIsSelectable)
objectDrop.\u type1=“行”
#self.scene.addPath(painterPath)
elif动作==协同动作:
self.copy()
elif action==Paaction:
self.paste()
def副本(自我):
item=self.selectedItem()
self.dragObject=项目
x=str(自拖放对象类型1)
如果项目为无:
返回
如果x中有“文本”:
self.object=QGraphicsPixmapItem(item.pixmap())
其他:
self.object=QGraphicsPathItem(item.path())
梯度=QLinearGradient(1,1,1,5)
渐变色设置颜色(0,QColor(Qt.灰色))
渐变色设置颜色(0.5,QColor(192,192,192,255))
渐变色设置色(1,QColor(Qt.darkGray))
self.object.setBrush(QBrush(渐变))
self.object.setPen(QPen(Qt.NoPen))
self.object.\u type1=项目.\u type1
def粘贴(自):
self.scene.addItem(self.object)
self.object.setPos(self.scene.grid.x(),self.scene.grid.y())
def selectedItem(自我):
items=self.scene.selectedItems()
如果长度(项目)==1:
退货项目[0]
一无所获
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=QApplication(sys.argv)
mainWindow=mainWindow()
mainWindow.show()
sys.exit(app.exec_())

复制QGraphicsItem不是一项简单的任务,在这种情况下,可以做的是保存最重要的功能并使用该信息重新创建另一个对象。在这种情况下,QDataStream可用于序列化可轻松传输的所述信息