PYQT5(13)-基本窗口控件-拖曳与剪贴板

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_())