基本窗口控件
十二、拖拽与剪贴板
1、Drag 与 Drop
- 很多桌面应用程序中,复制和移动对象都可以通过拖拽来完成。
- 基于 MIME(Multipurpose Internet Mail Extension,多用途互联网邮件拓展类型)的拖拽传输数据是基于 QDrag 类的。
- QMimeData 对象将关联的数据与对应的 MIME类型相关联。
- MimeData 类允许检测和使用方便的 MIME 类型
判断函数 设置函数 获取函数 MIME 类型 hasText() text() setText() text/plain hasHtml() html() setHtml() text/html hasUrls() urls() setUrls() text/uri-list hasImage() imageData() setImageData() image/* hasColor() colorData() setColorData() application/x-color - 常用拖拽事件如下表:
事件 描述 DragEnterEvent 当执行一个拖拽控件操作,并且鼠标指针进入该控件时,这个事件将被触发。在这个事件中可以获得被操作的窗口控件,还可以有条件地接受或拒接该拖拽操作 DragMoveEvent 在拖拽操作进行时会触发该事件 DragLeaveEvent 当执行一个拖拽控件操作,并且鼠标指针离开该控件时,触发该事件 DropEvent 当拖拽操作在目标控件上被释放时,这个事件将被触发 - 拖拽功能示例:
# -*- coding:utf-8 -*- # Time : 2019/08/18 上午 9:34 # Author : 御承扬 # e-mail:2923616405@qq.com # project: PyQt5 # File : qt30_drag.py # @software: PyCharm 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("简单的拖拽例子") self.setWindowIcon(QIcon("./images/Python2.ico")) if __name__ == "__main__": app = QApplication(sys.argv) ex = Example() ex.show() sys.exit(app.exec_())
- 运行效果如下:
- 控制台输出
<PyQt5.QtGui.QDragEnterEvent object at 0x000001CABBF64CA8> <PyQt5.QtGui.QDragEnterEvent object at 0x000001CABBF64CA8>
2、QClipboard
- QClipboard 类提供了对系统剪贴板的访问,可以在应用程序之间复制和粘贴数据。
- QApplication 类有一个静态方法 clipboard(),该方法返回一个对剪贴板对象的引用,任何类型的 MimeData 都可以从剪贴板复制或粘贴。
- QClipboard 类中常用方法如下表:
方法 描述 clear() 清除剪贴板内容 setImage() 将 QImage 对象复制到剪贴板中 setMimeData() 将 MIME 数据设置为剪贴板 setPixmap() 从剪贴板复制 Pixmap 对象 setText() 从剪贴板中复制文本 text() 从剪贴板中检索文本 - QClipboard 类的常用信号有 dataChanged,当剪贴板内容发生变化时,这个信号被触发。
- QClipboard 使用示例:
# -*- coding:utf-8 -*- # Time : 2019/08/18 上午 10:45 # Author : 御承扬 # e-mail:2923616405@qq.com # project: PyQt5 # File : qt31_Clipboard.py # @software: PyCharm import os import sys from PyQt5.QtCore import QMimeData from PyQt5.QtWidgets import * from PyQt5.QtGui import QPixmap, QIcon 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/Python2.ico"))) 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 例子") self.setWindowIcon(QIcon("./images/Python2.ico")) 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.jpg"))) 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_())
- 运行效果如下: