0

如果我想在剪贴板中使用带引号的字符串:

qDebug() << QString("Boat\nProgramming");

然后我复制输出:

"Boat\nProgramming"

如果我想在我的剪贴板中使用未引用的字符串:

qDebug().noquote() << QString("Boat\nProgramming");

然后我复制输出:

Boat
Programming

Qt 中将带引号和不带引号的字符串注册到我的 [Ubuntu] 系统剪贴板的正确方法是什么?


背景故事/用例:

我已经构建了一个命令行应用程序,它为我呈现字符串,我偶尔需要将其转储到网站的字符串解释器(如果你愿意的话,文本到语音)以进行调试。将其转储到剪贴板而不是手动突出显示文本、复制和粘贴,确实改善了我的工作流程。

4

2 回答 2

4

“引用的字符串”非常模棱两可。例如,在 shell 中,美元符号是特殊的(通常应该转义,就像其他一些字符一样)。但是在 HTML 中<>, , &, '," 是特殊的(通常应该被转义)。在 SQL 语句中,您应该只转义双引号和 nul 字符。在 C 中,您可以转义控制字符以及引号、双引号和反斜杠等……在 JSON 中规则略有不同。

所以首先编码适当的引用转换。也许您想实现以下功能

QString quoted_for_shell(const QString&);
QString quoted_for_html(const QString&);
QString quoted_for_c(const QString&);

等等。

(也许您还应该对反向取消引用转换进行编码;顺便说一句,引用可能很棘手:您将如何用俄语、西里尔字母引用我的全名:Василий Дмитриевич Старынкевич,因为并非所有 C 实现都使用 UTF-8,即使它们应该

一旦你实现了你的报价机制(这可能比你想象的更难,更不明确!),你“只是”想将QStrings 复制到剪贴板。然后阅读QClipboard的文档,也许还有关于拖放的章节。

顺便说一句,当心代码注入(这就是为什么引用非常重要的部分原因)。想想一些恶意rm -rf $HOME 字符串等......

实际上,剪贴板处理对于X11来说是一件很微妙的事情。参见ICCCMEWMH。您很可能需要运行一些事件循环(特别是对于数百万字节的非常长的字符串,选择处理必须通过几次握手而递增,并且细节可能很棘手,但由 Qt 处理)。所以你可能需要QApplication::exec

于 2016-11-05T09:01:28.873 回答
0

这是我实现的一个非常简单的解决方案:

// #include <QCoreApplication>
// I had to swap to QGuiApplication to get the clipboard functionality.
#include <QGuiApplication>
#include <QClipboard>
#include "whatever.h"

int main(int argc, char *argv[])
{
    QGuiApplication a(argc, argv);
    a.clipboard()->setText(QString("Boat\nProgramming")); // Quoted
    a.clipboard()->setText(QString("Boat\nProgramming")   // Non-Quoted
                           .replace("\n","\\n")
                           .replace("\t","\\t"));

    return 0;
}

正如 Basile Starynkevitch 所建议的那样;这些不是严格保护的函数,而是小字符串的准系统解决方案。在我的情况下是临时的,纯粹用于调试目的。请务必阅读他的帖子,因为他提供了避免代码注入和其他安全风险的最佳实践。

于 2016-11-05T10:44:36.873 回答