应用之间交换数据除了可以使用拖放技术外,还可使用剪贴板。一个应用把数据放到剪贴板,另一个应用从剪贴板中提出数据。 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文本。
- 使用剪贴板粘贴图像。
|