分享

实战PyQt5: 101

 大傻子的文渊阁 2023-02-06 发布于浙江

应用之间交换数据除了可以使用拖放技术外,还可使用剪贴板。一个应用把数据放到剪贴板,另一个应用从剪贴板中提出数据。

QClipboard简介

QClipboard类提供了对系统剪切板的访问,可以在应用程序之间复制和粘贴数据,它的操作类似于QDrag类,并使用类似的数据结构。

获取对全局剪贴板对象的引用,可使用QAppiication类的静态方法:
clipboard = QAppiication.clipboard()

任何类型的MimeData都可以从剪切板复制或粘贴。

QClipboard类的常用方法:

clipboard.setImage (QtGui.QImage ("image.jpg"))
  • image (): 返回一个QImage对象
  • <>类图像放置到剪贴板。如:map): 将QPixmap(img : QPixmaptPixi>se
clipboard.setPixmap (QtGui.QPixmap ("image, jpg"))
  • pixmap(): 返回一个QImage对象。
  • <>
  • clear(): 清空剪贴板数据。
  • mimeData() : 返回一个QMimeData对象。
  • tMimeData(data :QMimeData): 将MimeData类型数据放置到剪贴板。QMimeData 类可以存放任意类型的数据。i>se

QClipboard类中的常用信号:

  • dataChanged(): 当剪切板内容发生变化时,发射这个信号。

测试QClipboard

测试代码中测试复制普通文本,HTML文本和图像三种方式,粘贴使用QMimeData进行格式判断,输出相应信息,因此粘贴功能也支持从其他应用中的数据拷贝粘贴操作,比如从notepad记事本中复制文本或者从mspaint绘图板中复制图像粘贴到窗口中。完整代码如下:

import sys,os
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt, QMimeData
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import (QApplication, QMainWindow, QFrame, QLabel,
                             QMenuBar, QMenu, QAction)
 
class DemoClipboard(QMainWindow):
    def __init__(self, parent=None):
        super(DemoClipboard, self).__init__(parent)   
        
         # 设置窗口标题
        self.setWindowTitle('实战PyQt5: QClipBoard 剪贴板演示')      
        # 设置窗口大小
        self.resize(400, 300)
      
        self.initUi()
        
        self.clipType=''
        
    def initUi(self):
        self.initMenu()
        
        self.showBox = QLabel()
        self.showBox.setFrameShape(QFrame.Box)
        self.showBox.setLineWidth(1)
        self.showBox.setAlignment(Qt.AlignCenter)
        
        self.setCentralWidget(self.showBox)
        
    def initMenu(self):
        mBar = self.menuBar()
        
        #文件菜单
        menuFile = mBar.addMenu('文件')
        #退出
        aExit = QAction('退出', self)
        aExit.triggered.connect(self.close)
        menuFile.addAction(aExit)
        
        #编辑菜单
        menuEdit = mBar.addMenu('编辑')
        aCopyText = QAction('复制文本', self)
        aCopyText.triggered.connect(self.onCopyText)
        aCopyHtml = QAction('复制Html文本', self)
        aCopyHtml.triggered.connect(self.onCopyHtml)
        aCopyImage = QAction('复制图像',self)
        aCopyImage.triggered.connect(self.onCopyImage)
        
        aPaste = QAction('粘贴', self)
        aPaste.triggered.connect(self.onPaste)
        
        menuEdit.addAction(aCopyText)
        menuEdit.addAction(aCopyHtml)
        menuEdit.addAction(aCopyImage)
        menuEdit.addSeparator()
        menuEdit.addAction(aPaste)
        
    def onCopyText(self):
        #设置剪贴板文本
        clipboard = QApplication.clipboard()
        clipboard.setText('这是一段剪贴板文本')
        
    def onCopyHtml(self):
        mimeData = QMimeData()
        mimeData.setHtml("<b>Bold and <font color=red>Red</font></b>")
        clipboard = QApplication.clipboard()
        clipboard.setMimeData(mimeData)
        
    def onCopyImage(self):
        clipboard = QApplication.clipboard()
        clipboard.setPixmap(QPixmap(os.path.dirname(__file__) + "/python-logo.png"))
        
    def onPaste(self):
        clipboard = QApplication.clipboard()
        mimeData = clipboard.mimeData()
        print(mimeData.formats())
        if mimeData.hasFormat('text/plain'):
            self.showBox.setText(clipboard.text())
            #也可以使用下面方式
            #self.showBox.setText(mimeData.text())
        elif mimeData.hasHtml():
            self.showBox.setText(mimeData.html())
        elif mimeData.hasFormat('application/x-qt-image'):
            self.showBox.setPixmap(clipboard.pixmap())
    
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = DemoClipboard()
    window.show()
    sys.exit(app.exec())

运行效果如下图:

剪贴板操作测试

本文知识点

  • 剪贴板操作和拖放操作的技术实现类似。
  • 使用剪贴板粘贴普通文本。
  • 使用剪贴板粘贴HTML文本。
  • 使用剪贴板粘贴图像。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多