PyQt4 - 将文件拖放到QPushButton中

时间:2015-04-21 18:37:40

标签: python qt drag-and-drop pyqt pyqt4

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

我已经按照了大量的小部件拖放教程,我的朋友已经有了列表,但是我开始相信它不能用于按钮吗?我知道你可以将文本拖放到按钮上。我还没有完全掌握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_())

1 个答案:

答案 0 :(得分:2)

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

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_())