0

クリップボードに引用符付きの文字列が必要な場合:

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

次に、出力をコピーします。

"Boat\nProgramming"

クリップボードに引用符で囲まれていない文字列が必要な場合:

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

次に、出力をコピーします。

Boat
Programming

[Ubuntu] システムのクリップボードに引用符で囲まれた文字列と引用符で囲まれていない文字列を Qt で登録する適切な方法は何ですか?


バックストーリー / ユースケース:

デバッグの目的で、Web サイトの文字列インタープリター (必要に応じてテキスト読み上げ) に時々ダンプする必要がある文字列をレンダリングするコマンド ライン アプリケーションを作成しました。手動でテキストを強調表示し、コピーして貼り付けるのではなく、クリップボードにダンプすると、私のワークフローが本当に改善されます。

4

2 に答える 2

4

「引用文字列」非常にあいまいです。たとえば、シェルではドル記号は特別です (他の文字と同様にエスケープする必要があります)。しかし、HTML では、、、、、<は特別です (多くの場合、 エスケープする必要があります)。SQL ステートメントでは、二重引用符とヌル文字のみをエスケープする必要があります。C では、制御文字、引用符、二重引用符、バックスラッシュなどをエスケープします。JSON ではルールが少し異なります。>&'"

したがって、最初に適切な引用変換をコーディングします。おそらく、次の機能を実装したいと思うでしょう

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

等々。

(おそらく、逆引用符なし変換もコーディングする必要があります。ところで、引用はトリッキーかもしれません: ロシア語のキリル文字で私のフルネームをどのように引用しますか?する必要があります)

引用機構を実装したら (それはおそらく、あなたが思っているよりも難しく、定義が曖昧です!)、単にQStrings をクリップボードにコピーしたいだけです。次に、QClipboardのドキュメントと、おそらくドラッグ アンド ドロップの章を読んでください。

ところで、コード インジェクションに注意してください(これが、引用が本当に重要な理由の 1 つです)。悪意のあるrm -rf $HOME 文字列などを考えてみてください....

実はX11 ではクリップボードの処理はデリケートなものです。ICCCM & EWMHを参照してください。イベント ループの実行が必要になる可能性が非常に高くなります (特に、数百万バイトの非常に長い文字列の場合、選択処理は数回のハンドシェイクで段階的に行われる必要があり、詳細は注意が必要ですが、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 に答える