91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PyQt5怎么使用mimeData實現拖拽事件

發布時間:2021-10-29 08:12:28 來源:億速云 閱讀:296 作者:iii 欄目:開發技術

本篇內容介紹了“PyQt5怎么使用mimeData實現拖拽事件”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

實現思路

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.textEditor = None
        self.initUI()
    def initUI(self):
        self.textEditor = QTextEdit()
        self.setCentralWidget(self.textEditor)
        self.textEditor.setAcceptDrops(False)
        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
        if self.readFile(fileName):
            self.setWindowTitle("Drag File Success")
    def readFile(self, fileName):
        r = False
        file = QFile(fileName)
        content = ""
        if file.open(QIODevice.ReadOnly):
            content = file.readAll()
            r = True
        self.textEditor.setText(str(content, "utf-8"))
        return r
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = ComplexDrag()
    ex.show()
    app.exec_()

上述代碼可以將外部的文件拖進來并進行展示,其中有幾個要點要注意一下:

1、我們并沒有創建QDrag事件,因為拖拽的起始并非在該窗口及窗口內的Widget中,而是從外部直接拖拽進來,這類事件本身已經有QDrag了

2、我們利用QMimeData中攜帶的信息判斷進入的拖拽事件是否為我們所需要的,即event.mimeData().hasFormat(“text/uri-list”), 關于里面的類型,可以自行查找該網站Media Types

3、上面我們沒有使用 event.accept 而是使用 acceptProposedAction 的原因如下圖

PyQt5怎么使用mimeData實現拖拽事件

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.takeItem(self.row(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.setText(item.text())
                drag = QDrag(self)
                drag.setMimeData(mimeData)
                pixmap = QPixmap("computer.svg").scaled(20, 20, Qt.KeepAspectRatio)
                drag.setPixmap(pixmap)
                self.removeItemWidget(item)
                if drag.exec(Qt.MoveAction) == Qt.MoveAction:
                    self.removeSel()
        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()
    app.exec_()

簡要說明一下上面的實現過程:
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

if drag.exec(Qt.MoveAction) == Qt.MoveAction:
   self.removeSel()

“PyQt5怎么使用mimeData實現拖拽事件”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西贡区| 将乐县| 黄陵县| 南阳市| 三门县| 滁州市| 绍兴市| 隆化县| 仁布县| 巫溪县| 温泉县| 河间市| 双鸭山市| 桦川县| 和静县| 名山县| 滕州市| 丰台区| 东平县| 襄樊市| 夹江县| 崇礼县| 乐安县| 新蔡县| 电白县| 菏泽市| 福鼎市| 阜南县| 界首市| 科技| 海晏县| 桐梓县| 西华县| 宝清县| 太谷县| 鄯善县| 紫金县| 固镇县| 山东| 渝中区| 商水县|