В Qt, как я могу зарегистрировать QString в буфере обмена моей системы, как в кавычках, так и без кавычек?

Если я хочу заключенную в кавычки строку в моем буфере обмена:

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

Затем я копирую вывод:

"Boat\nProgramming"

Если я хочу строку без кавычек в моем буфере обмена:

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

Затем я копирую вывод:

Boat
Programming

Как правильно в Qt регистрировать строки в кавычках и без кавычек в буфер обмена моей системы [Ubuntu]?


Backstory / Usecase:

Я построил приложение командной строки, которое отображает мне строки, которые мне иногда нужно выгружать в интерпретатор строк веб-сайта (текст в речь, если вам нужно) для целей отладки. Выгрузка его в буфер обмена вместо выделения текста вручную, копирование и вставка действительно улучшают мой рабочий процесс.

0

Решение

«Цитируемая строка» является очень неоднозначно. Например, в оболочке знак доллара является специальным (и часто должен быть экранирован, как некоторые другие символы). Но в HTML <, >, &, ', " являются особенными (и часто следует избегать). В операторах SQL вы должны избегать только двойной кавычки и символа nul. В C вы должны избегать управляющих символов, а также кавычек, двойных кавычек, обратной косой черты и т. Д. В JSON правила немного отличаются.

Итак, сначала закодируйте соответствующие преобразования кавычек. Возможно, вы хотите реализовать следующие функции

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

и так далее.

(возможно, вам следует также закодировать обратные преобразования без кавычек; кстати, цитаты могут быть хитрыми: как бы вы процитировали мое полное имя на русском, кириллические буквы: Василий Дмитриевич Старынкевич в C, поскольку не все реализации C используют UTF-8, даже если им следует)

После того, как вы внедрили свой котировальный механизм (а это, возможно, сложнее и более плохо определено, чем вы думаете!), Вы «просто» хотите скопировать QStringс в буфер обмена. Тогда прочитайте документацию QClipboard и, возможно, глава о перетащить.

Кстати, остерегайтесь внедрение кода (отчасти поэтому цитирование действительно важно). Подумайте о некоторых злых rm -rf $HOME строка и т.д ….

На самом деле, обработка буфера обмена деликатная вещь с X11. Увидеть ICCCM & EWMH. Вам очень вероятно нужно немного цикл событий выполняется (особенно для очень длинных строк из многих миллионов байтов, обработка выбора должна быть инкрементной с несколькими рукопожатиями, и детали могут быть сложными, но обрабатываются Qt). Так что вам может понадобиться QApplication :: Exec

4

Другие решения

Вот очень скромное решение, которое я реализовал:

// #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;
}

По предложению Василия Старынкевича; это не строго защищенные функции, а простые решения для небольших струн. Временные в моем случае и используются исключительно для целей отладки. Пожалуйста, прочитайте его пост, так как он предоставляет лучшие методы, чтобы избежать внедрения кода и других угроз безопасности.

0