【发布时间】:2013-07-23 22:28:52
【问题描述】:
在我的应用程序中的 QListView 执行(成功)拖放操作到资源管理器等外部目标之后,我试图从 qt 获取任何类型的通知。
到目前为止我尝试过的事情:
- QDropEvent:似乎只从内部小部件触发。
- mouseReleaseEvent:当我使用 QDrop 时停止工作
- 我尝试使用 pyhook 设置鼠标钩,以便在拖动后捕捉鼠标向上。这适用于成功的下降,但在之后挂起 拒绝投放
任何指针都会有所帮助。
编辑
忘记密码
# -*- coding: utf-8 -*-
import sys
import pyHook
from PySide import QtGui
from PySide import QtCore
app = QtGui.QApplication(sys.argv)
class MainWidget(QtGui.QWidget):
def __init__(self):
super(MainWidget, self).__init__()
thumbViewModel = ThumbItemModel([ "item1" , "item2" , "item3" ])
self.thumbView = ThumbnailView()
self.thumbView.setModel(thumbViewModel)
self.hm = pyHook.HookManager()
self.hm.MouseLeftUp = self.onLeftMouseUp
self.hm.HookMouse() #this will make the program unresponsive after an unsuccessful drop
mainLayout = QtGui.QVBoxLayout()
mainLayout.addWidget(self.thumbView)
self.setLayout(mainLayout)
self.show()
def onLeftMouseUp(self, event):
print(event.Position)
return True
class ThumbnailView(QtGui.QListView):
def __init__(self, *args, **kwds):
super(ThumbnailView, self).__init__(*args, **kwds)
self.setDragEnabled(True)
def mouseReleaseEvent(self, event):
#only works with setDragEnabled(False)
print('mouse released')
def dropEvent(self, event):
print('dropped')
return QtGui.QListView.dropEvent(self, event)
def startDrag(self, *args, **kwargs):
print('drag started')
return QtGui.QListView.startDrag(self, *args, **kwargs)
class ThumbItemModel(QtGui.QStringListModel):
def __init__(self, *args, **kwds):
super(ThumbItemModel, self).__init__(*args, **kwds)
def supportedDropActions(self):
return QtCore.Qt.MoveAction | QtCore.Qt.CopyAction
def flags(self, index):
if not index.isValid():
return QtCore.Qt.ItemIsEnabled
return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | \
QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsDropEnabled
def mimeTypes(self):
return ['text/uri-list', 'text/plain']
def mimeData(self, indexes):
mimedata = QtCore.QMimeData()
fakeFile = 'file:///C:/matToObj.ms'
mimedata.setData('text/uri-list', QtCore.QByteArray(fakeFile))
return mimedata
def dropMimeData(self, data, action, row, column, parent):
print('dropMimeData %s %s %s %s' % (data.data('text/uri-list'), action, row, parent))
return True
widget = MainWidget()
widget.show()
sys.exit(app.exec_())
【问题讨论】:
-
你能展示一个你迄今为止尝试过的代码示例吗?
-
这个链接可能会给你一些帮助link
-
不,抱歉,据我所知,它没有说明外部下降后的事件
-
您是否在小部件上尝试过 setAcceptDrops() ?在我的应用中拖放外部工作:github.com/jeremysanders/veusz/blob/master/windows/…
-
这只会在小部件上启用。我需要一种方法来触发在我的应用程序之外放置的事件。
标签: windows qt drag-and-drop pyqt pyside