Windows QT:外部拖放后的通知
在应用程序中的QListView向外部目标(如资源管理器)执行(成功)拖放操作后,我尝试从qt获取任何类型的通知 到目前为止我已经尝试过的事情:Windows QT:外部拖放后的通知,windows,qt,drag-and-drop,pyqt,pyside,Windows,Qt,Drag And Drop,Pyqt,Pyside,在应用程序中的QListView向外部目标(如资源管理器)执行(成功)拖放操作后,我尝试从qt获取任何类型的通知 到目前为止我已经尝试过的事情: QDropEvent:似乎只从内部小部件启动 mouseReleaseEvent:使用QDrop时停止工作 我试着用pyhook设置一个鼠标挂钩,以便在拖动鼠标后抓住鼠标。这适用于成功的下降,但在下降后会挂起 拒绝滴 任何指示都会有帮助 编辑 忘记密码了 # -*- coding: utf-8 -*- import sys import pyHo
- 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_())
删除pyHook内容,然后向
ThumbnailView
类添加以下内容:
def mousePressEvent(self, event):
if (event.button() == QtCore.Qt.LeftButton):
self.dragStartPosition = event.pos()
def mouseMoveEvent(self, event):
if (not (event.buttons() & QtCore.Qt.LeftButton)):
return
if ((event.pos() - self.dragStartPosition).manhattanLength() < QtGui.QApplication.startDragDistance()):
return
drag = QtGui.QDrag(self)
mimeData = QtCore.QMimeData()
mimeData.setData('text/uri-list', 'file:///C:/matToObj.ms')
drag.setMimeData(mimeData)
dropAction = drag.exec_(QtCore.Qt.CopyAction | QtCore.Qt.MoveAction)
print 'dropped: %d'%dropAction
def mousePressEvent(self,event):
如果(event.button()==QtCore.Qt.LeftButton):
self.dragStartPosition=event.pos()
def mouseMoveEvent(自身、事件):
如果(不是(event.buttons()&QtCore.Qt.LeftButton)):
返回
如果((event.pos()-self.dragStartPosition).manhattanLength()
<代码> DROPACTION/COMPUT>将包含一个值,该值指示是否失败或接受了,如这里所列出的:(C++页面,很容易翻译为Python)
请注意,此代码基于以下示例:显然,您可能希望对其进行扩展,以便mime数据实际上包含一个路径,该路径依赖于当时正在拖动的特定项!您可能还想更改传递给drag.exec_u1;()的内容。能否显示您迄今为止尝试的代码示例?此链接可能会给您一些帮助。不,对不起,据我所知,它没有说明任何关于外部Drops后的事件您尝试在小部件上设置AcceptDrops()?外部拖放在我的应用程序中起作用:这只允许在小部件上进行拖放。我需要一种方法来触发事件,以便在我的应用程序之外滴一滴。