指定从 Qt 应用程序复制的文本格式?粘贴时以某种方式使其他应用程序崩溃

Specify format(s) of text copied from Qt app? Somehow crashes other app when pasted

我正在制作一个小型 Qt/Pyside2/QML 应用程序,其全部目的是方便地生成和复制一些文本以粘贴到另一个程序中。 (以防万一,它是 https://lackeyccg.com/;我怀疑唯一可能相关的事实是它太老了,根本无法很好地与 Unicode 兼容。)我目前 运行 macOS 10.13,以防特定剪贴板相关。

在 PySide 中,我这样复制文本:

clipboard = QGuiApplication.clipboard()
clipboard.setText(text_to_copy)

调用 clipboard.mimeData().formats() 告诉我数据的格式为 text/plain。切换到文本编辑器、网络浏览器等并粘贴就可以了。此外,如果我然后 select 我粘贴的内容,复制 that,然后将其粘贴到 LackeyCCG,一切又都很好。不幸的是,在 Qt 中复制后直接粘贴到 LackeyCCG 会使 Lackey 崩溃。

我已经用几个测试字符串验证了这一点,排除了非 ASCII 字符或换行符等可能的原因;似乎唯一 不会 导致崩溃的是空字符串。

我猜这与 Qt 提供的文本格式有关。通过命令行上的运行 osascript -e 'the clipboard as record' | less,我可以检查系统剪贴板的内容。从多个文本编辑器以及 Chrome 复制的文本包含 <<class utf8>><<class ut16>>string 格式。 (string 版本的换行符被回车 returns 代替,这很奇怪。)相比之下,从我的 Qt 应用程序复制的文本包含 stringUnicode text<<class ut16>>(它的 string 有普通的换行符)。

我对文本编码的细节不是很了解,但这里的操作差异似乎可能是缺少 UTF-8 版本。显然,大多数现代应用程序都足够聪明,可以解释 Qt 提供给它们的内容,即使它与大多数应用程序显然产生的内容不同。但是对于我们这些试图粘贴到废弃软件中的人来说,有没有办法强制 Qt/PySide2 以特定格式输出文本? (或者对问题可能是什么的任何见解,如果不是的话?)

虽然我仍然不知道 PySide2 自己的机制是否可行,但我找到了一个非常简单的解决方案:https://pypi.org/project/pyperclip/

import pyperclip
pyperclip.copy(text_to_copy)

然后剪贴板包含一个 UTF-8 版本,一切正常。