1

我有一个预先存在的函数,可以生成富文本/html 报告。我的应用程序在工具提示中显示此报告。我添加了使用以下代码将此报告复制到剪贴板的功能:

    reportRichText = generateReport()
    clipboard = QApplication.clipboard()
    reportRichTextMime = QMimeData()
    reportRichTextMime.setHtml(reportRichText )
    clipboard.setMimeData(reportRichTextMime)

这使我可以复制报告并将其粘贴到任何接受富文本的内容中。例如,我可以将报告很好地粘贴到 MS Word 中。但是,问题是我无法粘贴到纯文本编辑器中。我只是有一个灰色的“粘贴”选项,就好像没有什么要粘贴一样。另一个有趣的花絮,如果我用 MS Word 进行“选择性粘贴”,我只能选择粘贴为“HTML 格式”,没有列出纯文本选项。

当然,如果我只是简单地使用 QClipboard 复制为纯文本,我可以复制粘贴到任何我想要的地方。但是我正在复制/粘贴所有标记。这显然是我不想要的。我要么想要富文本,要么想要未标记的纯文本。

我期望的行为是您从网络浏览器复制/粘贴文本时得到的行为。对于接受富文本的应用程序,将粘贴富文本(此外,MS Word 将允许您粘贴为纯文本或富文本)。对于纯文本编辑器,未渲染的纯文本被粘贴到纯文本编辑器中。

如何使用 QClipboard 获取也可以粘贴为纯文本的富文本?

4

2 回答 2

2

好吧,我很确定正确的方法是在QMimeData 上同时调用setText 和 setHtml。来自QMimeData 的 QT 文档

单个 QMimeData 对象可以同时使用几种不同的格式存储相同的数据

IE 如果你这样做:

reportRichText = generateReport()
clipboard = QApplication.clipboard()
reportRichTextMime = QMimeData()
reportRichTextMime.setHtml(reportRichText)
reportRichTextMime.setText("hello!")
clipboard.setMimeData(reportRichTextMime)

然后你得到:

你好!

粘贴到接受纯文本的编辑器中,而我在接受 rtf 文本的编辑器中的漂亮报告。这是因为“你好!” 是数据的纯文本表示,而我的报告是 HTML 表示。

对于我的报告,我只是决定返回并找出一种以 HTML 和纯文本格式生成报告的方法,这并不像我想象的那样烦人或困难。所以实际上我现在拥有的是:

reportRichText = generateReport(rtf=True)
reportPlainText = generateReport(rtf=False)
clipboard = QApplication.clipboard()
reportRichTextMime = QMimeData()
reportRichTextMime.setHtml(reportRichText)
reportRichTextMime.setText(reportPlainText)
clipboard.setMimeData(reportRichTextMime)

这似乎可以解决问题

于 2012-04-07T15:46:47.707 回答
1

我对 Qt 还不是很熟悉,但是从一些谷歌搜索来看,您似乎需要子类化QMimeData并编写自己的html()方法text()来返回 HTML 和文本版本的数据,以及返回的formats()方法text/htmltext/plain支持的类型目的。然后把它放在剪贴板上。

于 2012-04-07T15:07:40.010 回答