如何将字典存入剪贴板以在另一个PyQt6窗口中复制粘贴?
在PyQt6的QApplication之间通过剪贴板传递字典
想要在两个独立的QApplication实例之间通过剪贴板传递字典数据,目前仅能实现文本的复制粘贴,尝试直接使用QMimeData传递字典失败,现通过自定义MIME类型+序列化的方式解决这个问题:
核心思路
QMimeData本身不支持直接存储字典,但可以通过以下步骤实现:
- 选择序列化方式(如
pickle或json)将字典转为可传输的字节流/字符串 - 定义唯一的自定义MIME类型,避免与系统默认类型冲突
- 复制时将序列化后的数据存入QMimeData,同时保留文本格式作为兼容 fallback
- 粘贴时优先检查剪贴板的自定义MIME类型,存在则反序列化还原字典
修改后的完整代码
import sys import pickle 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 Dict to ClipBoard') self.Paste_PB = QPushButton('Paste Dict 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): text = self.Text_EL.text() my_dict = {'text': text, 'extra_info': 'custom data', 'number': 123} # 序列化字典为字节流 serialized_dict = pickle.dumps(my_dict) # 创建QMimeData并设置自定义MIME类型数据 mime_data = QMimeData() mime_data.setData('application/x-my-custom-dict', serialized_dict) # 同时设置文本作为兼容 fallback mime_data.setText(text) # 写入剪贴板 clipboard = QApplication.clipboard() clipboard.clear(mode=QClipboard.Mode.Clipboard) clipboard.setMimeData(mime_data, mode=QClipboard.Mode.Clipboard) def Paste_fun(self): clipboard = QApplication.clipboard() mime_data = clipboard.mimeData(mode=QClipboard.Mode.Clipboard) # 优先读取自定义MIME类型数据 if mime_data.hasFormat('application/x-my-custom-dict'): serialized_dict = mime_data.data('application/x-my-custom-dict').data() my_dict = pickle.loads(serialized_dict) self.Text_EL.setText(my_dict['text']) print(f"完整字典内容: {my_dict}") else: # 无自定义数据则 fallback 到文本 text = mime_data.text() self.Text_EL.setText(text) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())
兼容性说明
如果需要跨语言/跨平台传递数据,建议替换为json序列化(pickle仅适用于Python环境):
- 复制时替换序列化代码:
import json serialized_dict = json.dumps(my_dict).encode('utf-8') - 粘贴时替换反序列化代码:
serialized_dict = mime_data.data('application/x-my-custom-dict').data().decode('utf-8') my_dict = json.loads(serialized_dict)
内容的提问来源于stack exchange,提问作者ymmx
相关产品推荐
相关产品推荐

