PyQt5使⽤mimeData实现拖拽事件教程⽰例解析下⽬录
实现思路
1、简要介绍QMimeData
2、QMimeData的⽤例1
在QT实现外部⽂件拖拽并展⽰
3、QMimeData的⽤例2
两个QListWidget之间的item交换
系列⽂章:
实现思路
1、简要介绍QMimeData
2、QMimeData的⽤例1:在QT实现外部⽂件拖拽并展⽰
3、QMimeData的⽤例2:两个QListWidget之间的item交换
两个⽤例的实现效果如下:
1、简要介绍QMimeData
关于拖拽事件与QMimeData的⼀些关系,在第⼀篇⽂章中已经说明清楚了,这篇⽂章主要是往QMimeData中存放⼀些数据,以供拖动及放置的时候做判断(及数据通过QMimeData传递)
在第⼀个例⼦中:由于⽂件的拖拽本⾝就存放了⼀些信息,因此我们并没有如第⼀篇⽂章那样创建⼀个QDrag,并且创建⼀个QMimeData
在第⼆个例⼦中:我们此时给mimeData设置了⼀个text值,⽤于之后交换ItemList
2、QMimeData的⽤例1
在QT实现外部⽂件拖拽并展⽰
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTextEdit
from PyQt5.QtCore import QIODevice, QFile
class ComplexDrag(QMainWindow):
def __init__(self):
super(ComplexDrag, self).__init__()
self.setAcceptDrops(True)
self.initUI()
def initUI(self):
self.Editor)
self.setAcceptDrops(True)
self.setWindowTitle("拖拽")
def dragEnterEvent(self, event):
if event.mimeData().hasFormat("text/uri-list"):
# 关于这个函数和accept的区别在下⾯会展⽰
event.acceptProposedAction()
def dropEvent(self, event):
urls = event.mimeData().urls()
if urls == "":
return
fileName = urls.pop().toLocalFile()
if fileName == "":
return
adFile(fileName):
self.setWindowTitle("Drag File Success")
def readFile(self, fileName):
r = False
file = QFile(fileName)
content = ""
if file.open(QIODevice.ReadOnly):
svg实例
content = adAll()
r = True
return r
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = ComplexDrag()
ex.show()
<_()
上述代码可以将外部的⽂件拖进来并进⾏展⽰,其中有⼏个要点要注意⼀下:
1、我们并没有创建QDrag事件,因为拖拽的起始并⾮在该窗⼝及窗⼝内的Widget中,⽽是从外部直接拖拽进来,这类事件本⾝已经有QDrag了
2、我们利⽤QMimeData中携带的信息判断进⼊的拖拽事件是否为我们所需要的,即event.mimeData().hasFormat(“text/uri-list”),关于⾥⾯的类型,可以⾃⾏查该⽹站Media Types
3、上⾯我们没有使⽤ event.accept ⽽是使⽤ acceptProposedAction 的原因如下图
4、拖放结束后,我们将⽂件读取进来并进⾏展⽰
3、QMimeData的⽤例2
两个QListWidget之间的item交换
# -*- coding: utf-8 -*-
import sys
from threading import Event
from PyQt5.QtGui import QDrag, QPixmap
from PyQt5.QtWidgets import QApplication, QHBoxLayout, QListWidget, QDialog
from PyQt5.QtCore import QMimeData, Qt
class MainWindow(QDialog):
def __init__(self):
super(MainWindow, self).__init__()
self.projectA = ComplexDrag(self)
self.projectB = ComplexDrag(self)
self.projectA.addItem("Giosue Carducci")
self.projectA.addItem("Eyvind Johnson")
self.projectA.addItem("Sally Prudhomme")
self.projectA.addItem("Henryk Sienkiewicz")
self.projectA.addItem("Carl Spitteler")
self.projectA.addItem("Rabindranath Tagore")
self.projectA.addItem("Kawabata Yasunari")
self.projectB.addItem("Rudolf Eucken")
self.projectB.addItem("Anatole France")
self.projectB.addItem("Rudyard Kipling")
self.projectB.addItem("Thomas Mann")
self.projectB.addItem("Eugene O'Neill")
self.projectB.addItem("Sigrid Undset")
lay = QHBoxLayout()
lay.addWidget(self.projectA)
lay.addWidget(self.projectB)
self.setLayout(lay)
class ComplexDrag(QListWidget):
onDropEvent = Event()
def __init__(self, parent=None):
super(ComplexDrag, self).__init__(parent)
self.setAcceptDrops(True)
self.startPos = None
def removeSel(self):
listItems = self.selectedItems()
if not listItems:
return
for item in listItems:
self.w(item))
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.startPos = event.pos()
super(ComplexDrag, self).mousePressEvent(event)
def mouseMoveEvent(self, event):
distance = (event.pos() - self.startPos).manhattanLength()
if distance >= QApplication.startDragDistance():
item = self.currentItem()
if item:
mimeData = QMimeData()
mimeData.())
drag = QDrag(self)
drag.setMimeData(mimeData)
pixmap = QPixmap("computer.svg").scaled(20, 20, Qt.KeepAspectRatio)
drag.setPixmap(pixmap)
(Qt.MoveAction) == Qt.MoveAction:
super(ComplexDrag, self).mouseMoveEvent(event)
def dragMoveEvent(self, event):
source = event.source()
if source and source != self:
event.setDropAction(Qt.MoveAction)
def dragEnterEvent(self, event):
source = event.source()
if source and source != self:
event.setDropAction(Qt.MoveAction)
event.accept()
def dropEvent(self, event):
source = event.source()
if source and source != self:
self.addItem(event.mimeData().text())
event.setDropAction(Qt.MoveAction)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MainWindow()
ex.show()
<_()
简要说明⼀下上⾯的实现过程:
1、我们在⼀个QWidget⾥⾯放置了两个QListWidget,并实现QListWidget之间item的交换
2、QListWidget中在mouseMoveEvent中创建了QDrag,并且我们创建⼀个QMimeData,并在其存储当前选中item的text ,此处我们还
设置了拖拽时候的图标样式(上⾯gif的是没有调整过⼤⼩的,实际效果可以把代码拿去⾃⼰运⾏⼀下)
3、在dragMoveEvent中判断是否为同源事件,⾮同源则将当前的拖拽设置为Qt.MoveAction
4、在dragEnterEvent中接收符合条件的拖拽事件
5、在dropEvent中,从QMimeData中获取最初设置的text值,并添加到当前的QListWidget,要注意的是,这⾥的self并⾮最初QDrag产⽣信号的self,两个self在这⾥其实代表的分别是两个窗⼝
6、在上⼀篇⽂章中说过,exec⽅法是阻塞⽅法,因此在整个拖拽事件运⾏完之后,⼜会回到下⾯这段
代码中,把后⾯的⽅法执⾏完,此时我们删去⾃⾝被拖动的item
(Qt.MoveAction) == Qt.MoveAction:
以上就是PyQt5使⽤mimeData实现拖拽事件教程⽰例解析下的详细内容,更多关于PyQt5拖拽事件mimeData使⽤的资料请关注其它相关⽂章!