指定从 Qt 应用程序复制的文本格式?粘贴时以某种方式使其他应用程序崩溃
Posted
技术标签:
【中文标题】指定从 Qt 应用程序复制的文本格式?粘贴时以某种方式使其他应用程序崩溃【英文标题】:Specify format(s) of text copied from Qt app? Somehow crashes other app when pasted 【发布时间】:2020-07-04 01:33:10 【问题描述】:我正在制作一个小型 Qt/Pyside2/QML 应用程序,其全部目的是方便地生成和复制一些文本以粘贴到另一个程序中。 (如果它很重要,它是https://lackeyccg.com/;我怀疑它的唯一可能相关的事实是它已经足够老了,它根本不能与 Unicode 很好地配合。)我目前正在运行 macOS 10.13,以防万一特定的剪贴板是相关的。
在 PySide 中,我像这样复制文本:
clipboard = QGuiApplication.clipboard()
clipboard.setText(text_to_copy)
调用clipboard.mimeData().formats()
告诉我数据格式为text/plain
。切换到文本编辑器、网络浏览器等并粘贴就可以了。此外,如果我然后选择我已粘贴的内容,复制 那个,并将其粘贴到 LackeyCCG 中,一切都会再次正常。不幸的是,在 Qt 中复制后直接粘贴到 LackeyCCG 会导致 Lackey 崩溃。
我已经用几个测试字符串验证了这一点,排除了可能的原因,如非 ASCII 字符或换行符;似乎唯一不会导致崩溃的是一个空字符串。
我猜这与 Qt 提供的文本格式有关。通过在命令行上运行osascript -e 'the clipboard as record' | less
,我可以检查系统剪贴板的内容。文本从多个文本编辑器以及 Chrome 复制时,包含<<class utf8>>
、<<class ut16>>
和string
格式。 (string
版本的换行符被回车取代,这很奇怪。)相比之下,从我的 Qt 应用程序复制的文本包含 string
、Unicode text
和 <<class ut16>>
(它的 string
有普通的换行符) .
我对文本编码的细节没有最准确的把握,但这里的操作差异似乎可能是缺少 UTF-8 版本。显然,大多数现代应用程序都足够聪明,可以解释 Qt 提供给他们的东西,即使它与大多数应用程序显然产生的不同。但是对于我们这些试图粘贴到废弃软件的人来说,有没有办法强制 Qt/PySide2 以特定格式输出文本? (或者任何关于问题可能是什么的见解,如果不是这样的话?)
【问题讨论】:
听起来很棘手......我唯一可以帮助你的是^M
代表回车符(你在 Python 字符串中得到 \r
的内容)。如果您说“特殊字符”没有区别,那么我的猜测是文本编码(UTF-8、UTF-16 等)不是首先要调查的,而是关于显然附加到剪贴板的元数据内容。也许这些数据有不同的协议——我不知道它们是如何构建的。
@lenz:谢谢你的澄清;我已经编辑了那部分。我无法找到有关粘贴板元数据的任何信息。根据这样的文章:eclecticlight.co/2020/05/12/…,它似乎只包含一组格式。如果您知道任何信息,我将不胜感激。
【参考方案1】:
虽然我仍然不知道 PySide2 自己的机制是否可行,但我找到了一个非常简单的解决方案:https://pypi.org/project/pyperclip/
import pyperclip
pyperclip.copy(text_to_copy)
剪贴板随后包含一个 UTF-8 版本,一切正常。
【讨论】:
以上是关于指定从 Qt 应用程序复制的文本格式?粘贴时以某种方式使其他应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
富文本框 .rtf 字符串与通过剪切和粘贴复制文本不同。如何获得相同的格式?