PyQt5—基本窗口控件之拖拽与剪贴板

基本窗口控件

十二、拖拽与剪贴板

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_())
    
  • 运行效果如下:
    在这里插入图片描述
    在这里插入图片描述
  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

御承扬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值