Если я хочу заключенную в кавычки строку в моем буфере обмена:
qDebug() << QString("Boat\nProgramming");
Затем я копирую вывод:
"Boat\nProgramming"
Если я хочу строку без кавычек в моем буфере обмена:
qDebug().noquote() << QString("Boat\nProgramming");
Затем я копирую вывод:
Boat
Programming
Как правильно в Qt регистрировать строки в кавычках и без кавычек в буфер обмена моей системы [Ubuntu]?
Я построил приложение командной строки, которое отображает мне строки, которые мне иногда нужно выгружать в интерпретатор строк веб-сайта (текст в речь, если вам нужно) для целей отладки. Выгрузка его в буфер обмена вместо выделения текста вручную, копирование и вставка действительно улучшают мой рабочий процесс.
«Цитируемая строка» является очень неоднозначно. Например, в оболочке знак доллара является специальным (и часто должен быть экранирован, как некоторые другие символы). Но в 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
Вот очень скромное решение, которое я реализовал:
// #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;
}
По предложению Василия Старынкевича; это не строго защищенные функции, а простые решения для небольших струн. Временные в моем случае и используются исключительно для целей отладки. Пожалуйста, прочитайте его пост, так как он предоставляет лучшие методы, чтобы избежать внедрения кода и других угроз безопасности.