在Qt中,我怎么能注册一个QString到我的系统的剪贴板,无论是引用和不引用?

如果我想在我的剪贴板中引用string:

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

然后我复制输出:

 "Boat\nProgramming" 

如果我想在剪贴板中使用非引号string:

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

然后我复制输出:

 Boat Programming 

在Qt中将正确引用和未引用的string注册到我的[Ubuntu]系统的剪贴板中的正确方法是什么?


Backstory / Usecase:

我已经构build了一个命令行应用程序,用于呈现string,我偶尔需要将其转储到网站的string解释器(文本到语音,如果您关心)以进行debugging。 将其转储到剪贴板而不是手动突出显示文本,复制和粘贴,确实改善了我的工作stream程。

“引用的字符串”非常含糊的 。 例如,在外壳中,美元符号是特殊的(通常应该像其他字符一样被转义)。 但在HTML中, <>&'"是特殊的(通常应该被转义)。在SQL语句中,你只能转义双引号和nul字符。在C中,你可以转义控制字符和引号和双引号和反斜杠,等等…在JSON规则稍有不同。

所以先编码适当的报价转换。 也许你想要实现以下功能

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

等等。

(也许你应该也想编写反向的不加引号的转换; BTW引用可能会很棘手:如何引用我的俄文全名,西里尔文字母:因为不是所有的C实现都使用UTF-8,所以即使它们应该 )

一旦你实现了你的引用机制(这可能比你想象的更难以定义),你只需要将QString复制到剪贴板。 然后阅读QClipboard的文档,也许阅读关于拖放的章节。

顺便说一句,注意代码注入 (这是部分为什么报价是非常重要的)。 想想一些恶意的rm -rf $HOME字符串等…

其实剪贴板处理是X11的一个微妙之处 。 参见ICCCM & EWMH 。 你很可能需要一些事件循环运行(特别是对于数百万字节的非常长的字符串,选择处理然后是增加几个握手,细节可能会很棘手,但由Qt处理)。 所以你可能需要QApplication :: exec

这是我实施的一个非常准确的解决方案:

 // #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所建议的那样; 这些不是严格保护的功能,而是小弦线的准系统解决方案。 暂时在我的情况下,纯粹用于调试目的。 请阅读他的帖子,因为他提供了避免代码注入的最佳实践以及其他安全风险。