我想使用剪贴板将字典从 Qapplication 传递到另一个应用程序。
我可以复制文本,但我不明白如何传递其他内容。我需要传递一个字典而不是文本。
这是一个最小的示例,我可以启动该软件两次并将文本复制到另一个:
import sys
import numpy as np
from PyQt6.QtGui import *
from PyQt6.QtCore import *
from PyQt6.QtWidgets import *
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__()
self.centralWidget = QWidget()
self.setCentralWidget(self.centralWidget)
self.mainHBOX = QVBoxLayout()
self.layout = QVBoxLayout()
self.Text_EL = QLineEdit('Some Text')
self.Copy_PB = QPushButton('Copy to ClipBoard')
self.Paste_PB = QPushButton('Paste from ClipBoard')
self.layout.addWidget(self.Text_EL)
self.layout.addWidget(self.Copy_PB)
self.layout.addWidget(self.Paste_PB)
self.mainHBOX.addLayout(self.layout)
self.centralWidget.setLayout(self.mainHBOX)
self.centralWidget.setFixedSize(QSize(300,400))
self.Copy_PB.clicked.connect(self.Copy_fun)
self.Paste_PB.clicked.connect(self.Paste_fun)
def Copy_fun(self):
# copy into clipboard
text = self.Text_EL.text()
# send a dictionary instead of a string
MyDict = {'text':text}
cb = QApplication.clipboard()
cb.clear(mode=QClipboard.Mode.Clipboard)
cb.setText(text, mode=QClipboard.Mode.Clipboard)
def Paste_fun(self):
# Paste from clipboard
cb = QApplication.clipboard()
text = cb.text()
self.Text_EL.setText(text)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
我尝试使用 QMimeData 进行一些操作,但似乎它无法处理词典
def Copy_fun(self):
# copy into clipboard
text = self.Text_EL.text()
# send a dictionary instead of a string
MyDict = {'text':text}
clipboard = QGuiApplication.clipboard()
data = QMimeData()
data.setData(MyDict)
clipboard.setMimeData(data, mode=QClipboard.Mode.Clipboard)
可以通过先使用
pickle
模块将字典序列化来将字典放入剪贴板。以下是操作方法:
import sys
import pickle
import numpy as np
from PyQt6.QtGui import *
from PyQt6.QtCore import *
from PyQt6.QtWidgets import *
class MainWindow(QMainWindow):
def __init__(self, parent=None):
# ...(现有的 __init__ 代码)...
def Copy_fun(self):
# 复制到剪贴板
text = self.Text_EL.text()
# 发送字典而不是字符串
MyDict = {'text': text}
# 序列化字典
serialized_data = pickle.dumps(MyDict)
cb = QApplication.clipboard()
cb.clear(mode=QClipboard.Mode.Clipboard)
cb.setText(serialized_data.decode(), mode=QClipboard.Mode.Clipboard)
def Paste_fun(self):
# 从剪贴板粘贴
cb = QApplication.clipboard()
text = cb.text()
try:
# 尝试反序列化数据
data = pickle.loads(text.encode())
except pickle.UnpicklingError:
# 如果文本不是有效的 pickle 数据,则处理错误
print("剪贴板中的无效数据")
return
self.Text_EL.setText(data.get('text', ''))
# ...(现有的代码的其余部分)...
说明:
-
导入
pickle
: 在文件顶部添加import pickle
。 -
序列化:
在
Copy_fun
中,使用pickle.dumps()
将MyDict
字典序列化为字节字符串。然后,使用.decode()
将字节字符串转换为字符串,因为QClipboard.setText
需要一个字符串参数。 -
反序列化:
在
Paste_fun
中,使用pickle.loads()
将来自剪贴板的字符串反序列化回字典。我们使用try-except
块来优雅地处理pickle.UnpicklingError
(如果剪贴板数据不是有效的 pickle 对象,则可能会发生这种情况)。 -
错误处理:
添加一个
try-except
块来捕获Paste_fun
中的反序列化错误。这可以防止因试图粘贴无效数据而导致程序崩溃。
现在,应该能够将字典复制到一个 PyQt6 应用程序的剪贴板,并将该字典粘贴到另一个 PyQt6 应用程序或支持序列化 Python 对象的任何其他应用程序。
标签:python,clipboard,pyqt6 From: 78352244