You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将字典存入剪贴板以在另一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 21:13:15