PyQt5——拖曳与剪切板

拖曳与剪切板

Drag与Drop

在很多桌面应用程序中,复制或移动对象都可以通过拖曳来完成。

基于MIME类型的拖曳数据传输是基于QDrag类的。QMimeData对象将关联的数据与其对应的MIME类型相关联。

常见的MIME类型(通用型)如下:

  • HTML文本 .html text/html
  • XML文档 .xml texe/xml
  • XHTML文档 .xhtml application/xhtml+xml
  • 普通文本 .txt text/plain
  • RTF文本 .rtf application/rtf
  • PDF文档 .pdf application/pdf
  • Microsoft Word 文件 .word application/msword
  • PNG图像 .png image/png
  • GIF图形 .gif iamge/gif
  • JPEG图形 .jpeg .jpg image/jpeg
  • au 声音文件 .au audio/basic
  • MIDI音乐文件 .mid .midi audio/midi audio/x-midi
  • RealAudio音乐文件 .ra .ram audio/x-pn-realaudio
  • MPEG文件 .mpg, .mpeg video/mpeg
  • AVI文件 .avi video/x-msvideo
  • GZIP文件 .gz application/x-gzip
  • TAR文件 .tar applicaiton/x-tar
  • 任意的二进制数据 application/actet-stream

很多的QWidget对象都支持拖曳动作,允许拖曳数据的控件必须设置QWidget.setDragEnable()为True,常用的拖曳事件

事件 描述
DragEnterEvent 当执行一个拖曳控件操作,并且鼠标指针进入该控件时,这个事件将被触发,在这个事件中可以获得被操作的窗口控件,还可以有条件接收或拒绝该拖曳操作
DragMoveEvent 在拖曳操作进行时会触发该事件
DragLeaveEvent 当执行一个拖曳控件操作,并且鼠标指针离开该控件的时候,这个事件将被触发
DropEvent 当拖曳操作在目标控件上被释放时,这个事件将被触发
# -*- coding: utf-8 -*-

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

PyQt5——拖曳与剪切板_第1张图片

<PyQt5.QtGui.QDragEnterEvent object at 0x000001B84F38CA68>
<PyQt5.QtGui.QDragEnterEvent object at 0x000001B84F38CA68>
<PyQt5.QtGui.QDragEnterEvent object at 0x000001B84F38CA68>

DrapEnterEvent会验证事件的MIME数据是否包含字符串文本,如果包含字符串文本,就接收事件提出的添加文本操作,并将文本作为新条目(item)添加到ComboBox

QClipboard

QCliboard 类提供了对系统剪贴板的访问,可以在应用程序之间复制和粘贴数据,类似QDrag类,并使用类似的数据类型。

QApplication类有一个静态方法clipboard(),它返回对剪贴板对象的引用,任何类型的MimeData都可以从剪贴板复制或粘贴。

常用的方法

方法 描述
clear() 清除剪贴板的内容
setImage() 将QImage对象复制到剪贴板中
setMimeData() 将MIME数据设置为剪贴板
setPixmap() 从剪贴板中复制Pixmap对象
setText() 从剪贴板中复制文本
text() 从剪贴板中检索文本

常用的信号

  • dataChanged() 当剪贴板内容发送变化时,这个信号被发射
# -*- coding: utf-8 -*-

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("Bold and Red")
        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_())

PyQt5——拖曳与剪切板_第2张图片

你可能感兴趣的:(Python)