PyQt4 - 将文件拖放到 QPushButton 中
PyQt4 - Dragging and dropping files into QPushButton
我认为这个标题是不言自明的。我正在努力创建一个小型独立应用程序,它要求用户将音频文件拖放到按钮上,然后通过使用文件路径等将文件与硬件上的相应按钮相关联...
我已经学习了大量关于小部件的拖放教程,我的朋友也学习了列表,但是我开始相信它不能为一个按钮完成?我知道您可以将文本拖放到按钮上。我还没有完全跟上 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_())
您发布的代码存在三个问题,主要是您甚至没有使用自己制作的自定义 Button
class。您只是在 window 中添加了一个常规按钮:
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_())
我认为这个标题是不言自明的。我正在努力创建一个小型独立应用程序,它要求用户将音频文件拖放到按钮上,然后通过使用文件路径等将文件与硬件上的相应按钮相关联...
我已经学习了大量关于小部件的拖放教程,我的朋友也学习了列表,但是我开始相信它不能为一个按钮完成?我知道您可以将文本拖放到按钮上。我还没有完全跟上 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_())
您发布的代码存在三个问题,主要是您甚至没有使用自己制作的自定义 Button
class。您只是在 window 中添加了一个常规按钮:
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_())