Drag与Drop
为用户提供的拖曳功能很直观,在很多桌面应用程序中,复制或移动对象都可以通过拖曳来完成。
基于MIME类型(Multipurpose Internet Mail Extension, 多用途互联网邮件扩展类型)的拖曳数据传输是基于QDrag类的。QMimeData对象将关联的数据与其对应的MIME类型相关联。
MIME类型的数据可以简单理解为互联网上的各种资源,比如文本、音频和视频资源等,互联网上的每一种资源都属于一种MIME类型的数据。
MimeData类函数允许检测和使用方便的MIME类型。
| 判断函数 | 设置函数 | 获取函数 | MIME类型 | 
| hasText() | text() | setText() | text/plain | 
| hasHtml() | html() | setHtml() | text/html | 
| hasUrls() | urls() | setUrls() | text/uri-list | 
| haslmage() | imageData() | setlmageData() | image/* | 
| hasColor() | colorData() | setColorData() | application/x-color | 
许多QWidget对象都支持拖曳动作,允许拖曳数据的控件必须设置QWidget.setDragEnabled()为True。另外,控件应该响应拖曳事件,以便存储所拖曳的数据。
常用的拖曳事件
| DragEnterEvent | 当执行一个拖曳控件操作,并且鼠标指针进入该控件时,这个事件将被触发。在这个事件中可以获得被操作的窗口控件,还可以有条件地接受或拒绝该拖曳操作 | 
| DragMoveEvent | 在拖曳操作进行时会触发该事件 | 
| DragLeaveEvent | 当执行一个拖曳控件操作,并且鼠标指针离开该控件时,这个事件将被触发 | 
| DropEvent | 当拖曳操作在目标控件上被释放时,这个事件将被触发 | 
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class Combo(QComboBox):
    def __init__(self, title, parent):
        super(Combo, self).__init__(parent)
        # 允许拖曳
        self.setAcceptDrops(True)
    def dragEnterEvent(self, e):
        print(e)
        if e.mimeData().hasText():
            e.accept()
        else:
            e.ignore()
    def dropEvent(self, e):
        self.addItem(e.mimeData().text())
class Example(QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()
    def initUI(self):
        lo = QFormLayout()
        lo.addRow(QLabel("请把左边的文本拖拽到右边的下拉菜单中"))
        edit = QLineEdit()
        # 允许拖曳控件
        edit.setDragEnabled(True)
        com = Combo("Button", self)
        lo.addRow(edit, com)
        self.setLayout(lo)
        self.setWindowTitle('简单拖拽例子')
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())

QClipboard
QClipboard类提供了对系统剪贴板的访问,可以在应用程序之间复制和粘贴数据。它的操作类似于QDrag类,并使用类似的数据类型。
QApplication类有一个静态方法clipboard(),它返回对剪贴板对象的引用。任何类型的MimeData都可以从剪贴板复制或粘贴。
常用方法
| clear() | 清除剪贴板的内容 | 
| setlmage() | 将QImage对象复制到剪贴板中 | 
| setMimeData() | 将MIME数据设置为剪贴板 | 
| setPixmap() | 从剪贴板中复制Pixmap对象 | 
| setText() | 从剪贴板中复制文本 | 
| text() | 从剪贴板中检索文本 | 
常用信号
dataChanged:当剪贴板内容发生变化时,这个信号被发射
import os
import sys
from PyQt5.QtCore import QMimeData
from PyQt5.QtWidgets import (QApplication, QDialog, QGridLayout, QLabel, QPushButton)
from PyQt5.QtGui import QPixmap
class Form(QDialog):
    def __init__(self, parent=None):
        super(Form, self).__init__(parent)
        textCopyButton = QPushButton("&Copy Text")
        textPasteButton = QPushButton("Paste &Text")
        htmlCopyButton = QPushButton("C&opy HTML")
        htmlPasteButton = QPushButton("Paste &HTML")
        imageCopyButton = QPushButton("Co&py Image")
        imagePasteButton = QPushButton("Paste &Image")
        self.textLabel = QLabel("Original text")
        self.imageLabel = QLabel()
        self.imageLabel.setPixmap(QPixmap(os.path.join(
            os.path.dirname(__file__), "images/clock.png")))
        layout = QGridLayout()
        layout.addWidget(textCopyButton, 0, 0)
        layout.addWidget(imageCopyButton, 0, 1)
        layout.addWidget(htmlCopyButton, 0, 2)
        layout.addWidget(textPasteButton, 1, 0)
        layout.addWidget(imagePasteButton, 1, 1)
        layout.addWidget(htmlPasteButton, 1, 2)
        layout.addWidget(self.textLabel, 2, 0, 1, 2)
        layout.addWidget(self.imageLabel, 2, 2)
        self.setLayout(layout)
        textCopyButton.clicked.connect(self.copyText)
        textPasteButton.clicked.connect(self.pasteText)
        htmlCopyButton.clicked.connect(self.copyHtml)
        htmlPasteButton.clicked.connect(self.pasteHtml)
        imageCopyButton.clicked.connect(self.copyImage)
        imagePasteButton.clicked.connect(self.pasteImage)
        self.setWindowTitle("Clipboard 例子")
    def copyText(self):
        clipboard = QApplication.clipboard()
        clipboard.setText("I've been clipped!")
    def pasteText(self):
        clipboard = QApplication.clipboard()
        self.textLabel.setText(clipboard.text())
    def copyImage(self):
        clipboard = QApplication.clipboard()
        clipboard.setPixmap(QPixmap(os.path.join(
            os.path.dirname(__file__), "./images/python.png")))
    def pasteImage(self):
        clipboard = QApplication.clipboard()
        self.imageLabel.setPixmap(clipboard.pixmap())
    def copyHtml(self):
        mimeData = QMimeData()
        mimeData.setHtml("<b>Bold and <font color=red>Red</font></b>")
        clipboard = QApplication.clipboard()
        clipboard.setMimeData(mimeData)
    def pasteHtml(self):
        clipboard = QApplication.clipboard()
        mimeData = clipboard.mimeData()
        if mimeData.hasHtml():
            self.textLabel.setText(mimeData.html())
if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = Form()
    form.show()
    sys.exit(app.exec_())







