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

在X11环境下实现支持多目标的持久化剪贴板

Linux下实现多Target剪贴板内容持久化

问题本质

X11剪贴板的内容持久化依赖系统剪贴板管理器,Qt程序退出后内容丢失是因为它作为剪贴板所有者释放了权限,而管理器未及时接管;xclip不支持多target是工具本身设计限制。

解决方案

1. 优化Qt代码实现持久化

无需保持Qt程序持续运行,只需给剪贴板管理器留足捕获内容的时间:
修改原Qt代码的退出逻辑:

# 复制到剪贴板
QApplication.clipboard().setMimeData(mime_data)
print("多格式图片已复制到剪贴板")

# 等待2秒,让剪贴板管理器读取并保存内容
import time
time.sleep(2)

app.quit()

运行后,Qt程序关闭时,剪贴板的多target内容会被系统管理器保留。

2. 使用GTK3实现更可靠的持久化

GTK3的剪贴板操作会自动触发管理器的持久化逻辑,无需额外等待:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk
from PIL import Image
import io

# 读取并转换图片格式
with open("image.png", "rb") as f:
    png_data = f.read()

img = Image.open("image.png")
jpg_buffer = io.BytesIO()
img.save(jpg_buffer, format='JPEG', quality=90)
jpg_data = jpg_buffer.getvalue()

# 设置剪贴板多格式数据
clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)

def provide_data(clipboard, selection, data, info, user_data):
    if info == 0:
        data.set(selection, 8, user_data["png"])
    elif info == 1:
        data.set(selection, 8, user_data["jpg"])

clipboard.set_with_data(
    [("image/png", 0, 0), ("image/jpeg", 0, 1)],
    provide_data,
    {"png": png_data, "jpg": jpg_data}
)

# 强制剪贴板管理器保存内容
clipboard.store()

print("多格式图片已复制,内容持久化")

运行后,剪贴板会同时保留image/png和image/jpeg两个target,且程序关闭后内容不会丢失。

3. 确保剪贴板管理器正常工作

如果桌面环境未默认启用剪贴板管理器,手动安装并配置:

  • GNOME:自带剪贴板管理,无需额外操作
  • KDE:确保klipper在后台运行
  • Xfce:安装parcellite并设置开机自启
  • 通用场景:安装copyq或clipit等功能完善的剪贴板管理器

验证方法

执行以下命令检查剪贴板的target列表:

xclip -selection clipboard -t TARGETS -o

应能看到image/png、image/jpeg等多个图片格式target,且关闭设置程序后再次检查,这些target依然存在。

内容的提问来源于stack exchange,提问作者fauve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:50:54