Python PyQt/PySide(已删除包装的C/C+;+;对象)

Python PyQt/PySide(已删除包装的C/C+;+;对象),python,pyqt,pyside,Python,Pyqt,Pyside,如果我运行此代码: import sys from PySide.QtCore import * from PySide.QtGui import * class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.setGeometry(200,200,800,400) self.mainWindowWidget =

如果我运行此代码:

import sys
from PySide.QtCore import *
from PySide.QtGui import *

class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()

        self.setGeometry(200,200,800,400)
        self.mainWindowWidget = QWidget()
        self.setCentralWidget(self.mainWindowWidget)

        self.mainWindowLayout = QGridLayout()
        self.mainWindowWidget.setLayout(self.mainWindowLayout)

        self.DnD = DragnDrop()
        self.DnD.setAcceptDrops(True)
        self.DnD.setAlignment(Qt.AlignCenter)
        self.DnD.setStyleSheet('''
        QLabel {
        border: 2px solid rgb(0, 0, 0);
        color: rgb(0, 0, 0);
        background-color: rgb(192, 192, 192);
        }
        ''')

        self.DnDList = QListWidget()

        self.mainWindowLayout.addWidget(self.DnD, 1, 0)
        self.mainWindowLayout.addWidget(self.DnDList, 2, 0)

class DragnDrop(QLabel):

    def __init__(self):
        QLabel.__init__(self)
        self.setAcceptDrops(True)


    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls():
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event):

        self.test = event.mimeData().urls()
        MainWindow().DnDList.addItem(str(self.test))

if __name__ == "__main__":

    myApp = QApplication(sys.argv)
    QApplication.setStyle(QStyleFactory.create('Plastique'))
    mainWindow = MainWindow()
    mainWindow.show()
    myApp.exec_()
    sys.exit(0)
如果我在QLabel上拖放文件,将出现此运行时错误

运行时错误:已删除QListWidget类型的包装C/C++对象

抱歉,如果我的代码示例很弱,但我不是很精通编程。目标是将一个文件放到
qlabel
上,并获取它的文件路径,然后将其显示在
qlistwidget

我看了看并提出了问题,但未能完全理解问题到底是什么,也未能完全理解我如何解决这个问题

编辑

我喜欢他的建议,但没有意识到

我试图发出一个自定义信号,但没有成功地将其传递给MainWindow类的函数

在我编辑的代码中:

    def dropEvent(self, event):

        self.test = event.mimeData().urls()
        MainWindow().DnDList.addItem(str(self.test))
致:

但我现在无法继续将该字符串添加到我的列表中。

我可以让它轻松运行(使用PyQt5,必须导入一些额外的内容,但我想这是PySide和PyQt5之间的区别),但拖放不起作用,我想这是你的问题。我认为最好是使用字符串发出一个自定义信号(如果可以在PySide中像PyQt5中那样发出),然后在mainwindow类中将其连接到一个函数,该函数将其添加到您在那里创建的列表中。现在您正试图将list元素添加到MainWindow().DnDList中,我认为它与在MainWindow类中创建的列表不同

编辑:这里是signal/slot方法的PyQt5实现

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()

        self.setGeometry(200,200,800,400)
        self.mainWindowWidget = QWidget()
        self.setCentralWidget(self.mainWindowWidget)

        self.mainWindowLayout = QGridLayout()
        self.mainWindowWidget.setLayout(self.mainWindowLayout)

        self.DnD = DragnDrop()
        self.DnD.linkDropped.connect(self.urlToList)
        self.DnD.setAcceptDrops(True)
        self.DnD.setAlignment(Qt.AlignCenter)
        self.DnD.setStyleSheet('''
        QLabel {
        border: 2px solid rgb(0, 0, 0);
        color: rgb(0, 0, 0);
        background-color: rgb(192, 192, 192);
        }
        ''')

        self.DnDList = QListWidget()

        self.mainWindowLayout.addWidget(self.DnD, 1, 0)
        self.mainWindowLayout.addWidget(self.DnDList, 2, 0)

    @pyqtSlot(str)
    def urlToList(self, url):
        self.DnDList.addItem(url)

class DragnDrop(QLabel):

    linkDropped = pyqtSignal(str)

    def __init__(self):
        QLabel.__init__(self)
        self.setAcceptDrops(True)


    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls():
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event):

        self.test = event.mimeData().urls()

        self.linkDropped.emit(self.test[0].toString())

if __name__ == "__main__":

    myApp = QApplication(sys.argv)
    QApplication.setStyle(QStyleFactory.create('Plastique'))
    mainWindow = MainWindow()
    mainWindow.show()
    myApp.exec_()
    sys.exit(0)
需要注意的是,self.test实际上是一个带有QURL的列表。因此,您需要使用0索引。如果要支持多个文件的拖放,请遍历列表中的项目,将每个项目转换为字符串并为每个元素发射,如下所示:

for i in self.test:
    self.linkDropped.emit(i.toString()) 
每个url都以一个文件开头:\\\prefix,因为我确信它在浏览器中,如果您不想使用以下文件,可能需要对其进行一些更改:

i.toString()[8:] 

如果你能看看我的照片就好了question@Sahelantro我确实在你的文章中做了一个有用的例子,但不是在pyside中,而是使用PyQt5方法,我认为这是不同的。“我暂时不能做任何事情,但如果在此期间没有人提供答案,我会尽我所能去尝试”。@Sahelantro,用代码更新了答案,不确定它是否能在PySide中工作,但我希望如此。如果用MainWindow替换MainWindow(),您的程序在PySide中运行良好,这是一个相当简单的错误。另外,报告的错误与我从您的代码中得到的有点不同。
i.toString()[8:]