依据当初VB Delphi VC的经验,这个是要调用Win32 API的!
什么WM_DROPFILES消息、DragQueryFile(hDropInfo,0,buf,200);DragAcceptFile;DragFinish三大函数,依据这个来找QT解决方案,曲折不过也有解!
其实不必拉,QT已经給我做好了每个QWidget都已经设置了setAccoptDrag函数,配合event这个事件参数,例子参照
dropsite.py 见附件就怎么简单! QT不简单!!!
#!/usr/bin/env python
# This is only needed for Python v2 but is harmless for Python v3.
import sip
sip.setapi('QString', 2)
sip.setapi('QVariant', 2)
from PyQt4 import QtCore, QtGui
class DropArea(QtGui.QLabel):
changed = QtCore.pyqtSignal(QtCore.QMimeData)
def __init__(self, parent = None):
super(DropArea, self).__init__(parent)
self.setMinimumSize(200, 200)
self.setFrameStyle(QtGui.QFrame.Sunken | QtGui.QFrame.StyledPanel)
self.setAlignment(QtCore.Qt.AlignCenter)
self.setAcceptDrops(True)
self.setAutoFillBackground(True)
self.clear()
def dragEnterEvent(self, event):
self.setText("<drop content>")
self.setBackgroundRole(QtGui.QPalette.Highlight)
event.acceptProposedAction()
self.changed.emit(event.mimeData())
def dragMoveEvent(self, event):
event.acceptProposedAction()
def dropEvent(self, event):
mimeData = event.mimeData()
if mimeData.hasImage():
self.setPixmap(QtGui.QPixmap(mimeData.imageData()))
elif mimeData.hasHtml():
self.setText(mimeData.html())
self.setTextFormat(QtCore.Qt.RichText)
elif mimeData.hasText():
self.setText(mimeData.text())
self.setTextFormat(QtCore.Qt.PlainText)
elif mimeData.hasUrls():
self.setText("\n".join([url.path() for url in mimeData.urls()]))
else:
self.setText("Cannot display data")
self.setBackgroundRole(QtGui.QPalette.Dark)
event.acceptProposedAction()
def dragLeaveEvent(self, event):
self.clear()
event.accept()
def clear(self):
self.setText("<drop content>")
self.setBackgroundRole(QtGui.QPalette.Dark)
self.changed.emit(None)
class DropSiteWindow(QtGui.QWidget):
def __init__(self):
super(DropSiteWindow, self).__init__()
self.abstractLabel = QtGui.QLabel(
"This example accepts drags from other applications and "
"displays the MIME types provided by the drag object.")
self.abstractLabel.setWordWrap(True)
self.abstractLabel.adjustSize()
self.dropArea = DropArea()
self.dropArea.changed.connect(self.updateFormatsTable)
self.formatsTable = QtGui.QTableWidget()
self.formatsTable.setColumnCount(2)
self.formatsTable.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
self.formatsTable.setHorizontalHeaderLabels(["Format", "Content"])
self.formatsTable.horizontalHeader().setStretchLastSection(True)
self.clearButton = QtGui.QPushButton("Clear")
self.quitButton = QtGui.QPushButton("Quit")
self.buttonBox = QtGui.QDialogButtonBox()
self.buttonBox.addButton(self.clearButton, QtGui.QDialogButtonBox.ActionRole)
self.buttonBox.addButton(self.quitButton, QtGui.QDialogButtonBox.RejectRole)
self.quitButton.pressed.connect(self.close)
self.clearButton.pressed.connect(self.dropArea.clear)
mainLayout = QtGui.QVBoxLayout()
mainLayout.addWidget(self.abstractLabel)
mainLayout.addWidget(self.dropArea)
mainLayout.addWidget(self.formatsTable)
mainLayout.addWidget(self.buttonBox)
self.setLayout(mainLayout)
self.setWindowTitle("Drop Site")
self.setMinimumSize(350, 500)
def updateFormatsTable(self, mimeData=None):
self.formatsTable.setRowCount(0)
if mimeData is None:
return
for format in mimeData.formats():
formatItem = QtGui.QTableWidgetItem(format)
formatItem.setFlags(QtCore.Qt.ItemIsEnabled)
formatItem.setTextAlignment(QtCore.Qt.AlignTop | QtCore.Qt.AlignLeft)
if format == 'text/plain':
text = mimeData.text().strip()
elif format == 'text/html':
text = mimeData.html().strip()
elif format == 'text/uri-list':
text = " ".join([url.toString() for url in mimeData.urls()])
else:
text = " ".join(["%02X" % ord(datum) for datum in mimeData.data(format)])
row = self.formatsTable.rowCount()
self.formatsTable.insertRow(row)
self.formatsTable.setItem(row, 0, QtGui.QTableWidgetItem(format))
self.formatsTable.setItem(row, 1, QtGui.QTableWidgetItem(text))
self.formatsTable.resizeColumnToContents(0)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = DropSiteWindow()
window.show()
sys.exit(app.exec_())