Python PyQt4-将文件拖放到QPushButton中

Python PyQt4-将文件拖放到QPushButton中,python,qt,drag-and-drop,pyqt,pyqt4,Python,Qt,Drag And Drop,Pyqt,Pyqt4,我认为这个标题是不言自明的。我正在努力创建一个小型的独立应用程序,它要求用户将音频文件拖放到按钮上,然后使用文件路径将文件与硬件上的相应按钮相关联,等等 我已经学习了很多关于小部件的拖放教程,我的朋友也学习了列表,但是我开始相信,一个按钮是做不到的?我知道您可以将文本拖放到按钮上。我还没有完全跟上Qt的速度,所以可能有一个我错过的明显错误 这是代码,非常感谢 import sys from PyQt4 import QtGui, QtCore class Button(QtGui.QPushB

我认为这个标题是不言自明的。我正在努力创建一个小型的独立应用程序,它要求用户将音频文件拖放到按钮上,然后使用文件路径将文件与硬件上的相应按钮相关联,等等

我已经学习了很多关于小部件的拖放教程,我的朋友也学习了列表,但是我开始相信,一个按钮是做不到的?我知道您可以将文本拖放到按钮上。我还没有完全跟上Qt的速度,所以可能有一个我错过的明显错误

这是代码,非常感谢

import sys
from PyQt4 import QtGui, QtCore

class Button(QtGui.QPushButton):
    def __init__(self, parent):
    super(Button, self).__init__(parent)
    self.setAcceptDrops(True)
    self.setDragDropMode(QAbstractItemView.InternalMove)

def dragEnterEvent(self, event):
    if event.mimeData().hasUrls():
        event.acceptProposedAction()
    else:
        super(Button, self).dragEnterEvent(event)

def dragMoveEvent(self, event):
    super(Button, self).dragMoveEvent(event)

def dropEvent(self, event):
    if event.mimeData().hasUrls():
        for url in event.mimeData().urls():
            path = self.addItem(url.path())
            print path
        event.acceptProposedAction()
    else:
        super(Button,self).dropEvent(event)

class MyWindow(QtGui.QWidget):
    def __init__(self):
        super(MyWindow,self).__init__()
        self.setGeometry(100,100,300,400)
        self.setWindowTitle("Filenames")

        self.btn = QtGui.QPushButton()
        self.btn.setGeometry(QtCore.QRect(90, 90, 61, 51))
        self.btn.setText("Change Me!")
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.btn)

        self.setLayout(layout)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

您发布的代码有三个问题,主要是您甚至没有使用自定义的
按钮
类。您只需在窗口中添加一个常规按钮:

self.btn = QtGui.QPushButton()
而不是:

self.btn = Button(self)
此外,QPushButtons没有
setDragDropMode()
方法,因此您需要对该行进行注释。我不知道它到底是干什么的

另外,QPushButton没有
addItem()
方法,所以我不确定这是怎么回事,除非您计划实现它。我在下面用打印文件路径替换了它

以下是代码的工作版本,它只打印拖动到按钮中的任何文件的文件路径:

import sys
from PyQt4 import QtGui, QtCore

class Button(QtGui.QPushButton):
    def __init__(self, parent):
        super(Button, self).__init__(parent)
        self.setAcceptDrops(True)
        #self.setDragDropMode(QAbstractItemView.InternalMove)

    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls():
            event.acceptProposedAction()
        else:
            super(Button, self).dragEnterEvent(event)

    def dragMoveEvent(self, event):
        super(Button, self).dragMoveEvent(event)

    def dropEvent(self, event):
        if event.mimeData().hasUrls():
            for url in event.mimeData().urls():
                print str(url.toLocalFile())
            event.acceptProposedAction()
        else:
            super(Button,self).dropEvent(event)

class MyWindow(QtGui.QWidget):
    def __init__(self):
        super(MyWindow,self).__init__()
        self.setGeometry(100,100,300,400)
        self.setWindowTitle("Filenames")

        self.btn = Button(self)
        self.btn.setGeometry(QtCore.QRect(90, 90, 61, 51))
        self.btn.setText("Change Me!")
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.btn)

        self.setLayout(layout)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

嗨,亚当,欢迎来到SO:)!在这样一个问题中,如果你发布更少的代码,并展示更多的问题,你会得到更多的回应。在这种情况下,也许你可以隔离到5-10行,表明它可能无法完成?嗨,Brick,干杯!一直在这里,所以我想我还是注册一下吧——最后!:)我会这么做,但我根本不知道错误在哪里,这就是为什么这真的让我难堪。脚本本身运行时没有任何错误,只是按钮不接受eventOk!好吧,我加入了一个编辑,应该会让它更容易阅读,然后希望有pyqt经验的人能够提供帮助。祝你好运:你有没有看过任何张贴的例子?我已经通读了一遍,并且还在继续这样做,还在这里搜索,是的。所有示例都只是在按钮或列表上使用文本。这里有一个我关注的好帖子,但它是针对QList的:()非常感谢!大部分代码刚刚从我在评论中提到的QList拖放线程中解放出来,正如您所知,我仍然在关注Qt。所以非常感谢你!谢谢这个例子!对于那些想将它与PyQt5一起使用的人来说,它对我很有用,我只需将模块“QtGui”重命名为“QtWidgets”