Python 如何将图片从QListview添加到QGraphicsView?(带拖放)

Python 如何将图片从QListview添加到QGraphicsView?(带拖放),python,pyqt,pyqt5,qgraphicsview,qlistview,Python,Pyqt,Pyqt5,Qgraphicsview,Qlistview,首先,我创建了QListview类。然后,我将项目添加到QListview中。之后,我创建了QGraphicsView类。我想通过拖放将项目的图片(由QListview创建)传输到QGraphicsView。我有个问题。我无法将项目的图片传送到班级。我的代码是这样的 类零件列表(QListView): 定义初始化(自身,父级): super()。\uuuu init\uuuu(父级) self.setGridSize(QSize(108,80)) self.partsModel=LibraryM

首先,我创建了QListview类。然后,我将项目添加到QListview中。之后,我创建了QGraphicsView类。我想通过拖放将项目的图片(由QListview创建)传输到QGraphicsView。我有个问题。我无法将项目的图片传送到班级。我的代码是这样的

类零件列表(QListView):
定义初始化(自身,父级):
super()。\uuuu init\uuuu(父级)
self.setGridSize(QSize(108,80))
self.partsModel=LibraryModel(self)
对于图像_列表中的i:
self.partsModel.appendRow(self.\u getPartItem(i))
self.setModel(self.partsModel)
self.setViewMode(self.IconMode)
self.setDragDropMode(self.DragOnly)
def_ugetpartItem(self,name):
part=QStandardItem()
pixmap=QPixmap(名称)
part.setData(pixmap,Qt.DecorationRole)
第.setText部分(名称)
part.setEditable(假)
返回部分
类库模型(QStandardItemModel):
def uuu init uuu(self,parent=None):
QStandardItemModel.\uuuuu init\uuuuuuuuu(自,父)
self.setColumnCount(1)
def模拟类型(自身):
返回['part/name']
def DropMimeData(自身,idxs):
mimedata=QMimeData()
对于idxs中的idx:
如果idx.isValid():
txt=self.data(idx,Qt.DisplayRole)
mimedata.setText(txt)
mimedata.setData('part/name',txt)
返回宫田
QGraphicsView

类示意图视图(QGraphicsView):
定义初始化(自身,父级):
self.scene=schematicsscene()
super()
自安装(0,0,1,1)
def dragEnterEvent(自身、事件):
event.accept()
def dragMoveEvent(自身,事件):
event.accept()
def dropEvent(自身,事件):
通过

无需创建新的mimetype,因为默认情况下模型已经有一个“application/x-qabstractitemmodeldatalist”,因此在这种情况下,我将只在QGraphicsView中创建一个虚拟模型来接收数据,从而能够在QGraphicsView中重用它

从PyQt5导入QtCore、QtGui、qtwidget
类PartsList(QtWidgets.QListView):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.setGridSize(QtCore.QSize(108,80))
self.setViewMode(QtWidgets.QListView.IconMode)
self.setDragDropMode(QtWidgets.QAbstractItemView.DragOnly)
self.\u model=QtGui.QStandardItemModel(self)
self.setModel(self.\u模型)
path=QtCore.QStandardPaths.writableLocation(
QtCore.qstandardpath.PicturesLocation
)
d=QtCore.QDir(路径)
格式=[
“*.{}”.format(fm.data().decode())
用于QtGui.QImageReader.supportedImageFormats()中的fm
]
有关d.EntryInfo列表中的信息(格式为QtCore.QDir.Files):
part=QtGui.QStandardItem(info.filePath())
pixmap=QtGui.QPixmap(info.absoluteFilePath())
setData(pixmap,QtCore.Qt.DecorationRole)
self.\u model.appendRow(部分)
类原理图视图(QtWidgets.QGraphicsView):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
场景=qtwidts.qgraphicscene(self)
self.setScene(场景)
自安装(0,0,1,1)
self.setAcceptDrops(真)
def dragEnterEvent(自身、事件):
if event.mimeData().hasFormat(
“应用程序/x-qabstractitemmodeldatalist”
):
event.acceptProposeAction()
def dragMoveEvent(自身,事件):
if event.mimeData().hasFormat(
“应用程序/x-qabstractitemmodeldatalist”
):
event.acceptProposeAction()
def dropEvent(自身,事件):
sp=self.maptosene(event.pos())
dummy_model=QtGui.QStandardItemModel()
虚拟模型(
event.mimeData(),event.dropAction(),0,0,QtCore.QModelIndex()
)
对于范围内的r(虚拟_model.rowCount()):
对于范围内的c(dummy_model.columnCount()):
ix=模型指数(r,c)
pixmap=ix.data(QtCore.Qt.DecorationRole)
pixmap_item=self.scene().addPixmap(pixmap)
pixmap_项目设置位置(sp)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=qtwidts.QWidget()
hlay=qtwidts.QHBoxLayout(w)
pl=零件列表()
sv=示意图视图()
hlay.addWidget(pl)
hlay.addWidget(sv)
w、 调整大小(640480)
w、 show()
sys.exit(app.exec_())

如果仍要继续使用另一个mimetype,则支持QListView等模型的视图中的正确选项是向mimeData添加新格式:

from PyQt5 import QtCore, QtGui, QtWidgets


class PartsList(QtWidgets.QListView):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setGridSize(QtCore.QSize(108, 80))
        self.setViewMode(QtWidgets.QListView.IconMode)
        self.setDragDropMode(QtWidgets.QAbstractItemView.DragOnly)
        self._model = LibraryModel(self)
        self.setModel(self._model)
        path = QtCore.QStandardPaths.writableLocation(
            QtCore.QStandardPaths.PicturesLocation
        )
        d = QtCore.QDir(path)
        formats = [
            "*.{}".format(fm.data().decode())
            for fm in QtGui.QImageReader.supportedImageFormats()
        ]
        for info in d.entryInfoList(formats, QtCore.QDir.Files):
            part = self.__getPartItem(info.filePath())
            self._model.appendRow(part)

    def __getPartItem(self, name):
        part = QtGui.QStandardItem()
        pixmap = QtGui.QPixmap(name)
        part.setData(pixmap, QtCore.Qt.DecorationRole)
        part.setText(name)
        part.setEditable(False)
        return part


class LibraryModel(QtGui.QStandardItemModel):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setColumnCount(1)

    def mimeTypes(self):
        return super().mimeTypes() + ["part/name"]

    def mimeData(self, indexes):
        data = super().mimeData(indexes)
        encoded = QtCore.QByteArray()
        stream = QtCore.QDataStream(encoded, QtCore.QIODevice.WriteOnly)
        for ix in indexes:
            stream << ix.data(QtCore.Qt.DecorationRole)
        data.setData("part/name", encoded)
        return data


class SchematicView(QtWidgets.QGraphicsView):
    def __init__(self, parent=None):
        super().__init__(parent)
        scene = QtWidgets.QGraphicsScene(self)
        self.setScene(scene)
        self.setSceneRect(0, 0, 1, 1)
        self.setAcceptDrops(True)

    def dragEnterEvent(self, event):
        if event.mimeData().hasFormat("part/name"):
            event.acceptProposedAction()

    def dragMoveEvent(self, event):
        if event.mimeData().hasFormat("part/name"):
            event.acceptProposedAction()

    def dropEvent(self, event):
        sp = self.mapToScene(event.pos())
        fmt = "part/name"
        data = event.mimeData()
        if data.hasFormat(fmt):
            encoded = data.data(fmt)
            stream = QtCore.QDataStream(encoded, QtCore.QIODevice.ReadOnly)
            pixmap = QtGui.QPixmap()
            while not stream.atEnd():
                stream >> pixmap
                pixmap_item = self.scene().addPixmap(pixmap)
                pixmap_item.setPos(sp)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QWidget()
    hlay = QtWidgets.QHBoxLayout(w)
    pl = PartsList()
    sv = SchematicView()
    hlay.addWidget(pl)
    hlay.addWidget(sv)
    w.resize(640, 480)
    w.show()
    sys.exit(app.exec_())
从PyQt5导入QtCore、QtGui、qtwidget
类PartsList(QtWidgets.QListView):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.setGridSize(QtCore.QSize(108,80))
self.setViewMode(QtWidgets.QListView.IconMode)
self.setDragDropMode(QtWidgets.QAbstractItemView.DragOnly)
self.\u model=图书馆模型(self)
self.setModel(self.\u模型)
path=QtCore.QStandardPaths.writableLocation(
QtCore.qstandardpath.PicturesLocation
)
d=QtCore.QDir(路径)
格式=[
“*.{}”.format(fm.data().decode())
用于QtGui.QImageReader.supportedImageFormats()中的fm
]
有关d.EntryInfo列表中的信息(格式为QtCore.QDir.Files):
part=self.\uu getPartItem(info.filePath())
self.\u model.appendRow(部分)
def_ugetpartItem(self,name):
part=QtGui.QStandardItem()
pixmap=QtGui.QPixmap(名称)
setData(pixmap,QtCore.Qt.DecorationRole)
第.setText部分(名称)
part.setEditable(假)
返回部分
类库模型(QtGui.QStandardItemModel):
定义i