4

を使用してQSyntaxHighlighter、内のテキストのブロックを強調表示していQTextEditます。QTextEditテキストは、適切な強調表示が付いたディスプレイで期待するように見えます。次にを呼び出すQTextEdit::toHtml()と、返される文字列には、で表示されている強調表示の色が含まれていませんQTextEdit。実際に強調表示されたテキストをhtml文字列として出力する方法はありますか?

サンプルコードは次のとおりです。

ScriptSyntaxHighlighter* scriptSyntaxHighlighter; //Implements QSyntaxHighlighter
QTextEdit* scriptTextEdit;
scriptTextEdit = new QTextEdit("//Here is a comment");
scriptSyntaxHighlighter = new ScriptSyntaxHighlighter(scriptTextEdit.document());
QString formattedText = scriptTextEdit.toHtml();

上記のコードを実行すると、表示されたQTextEditにきれいな色のコメントが表示されます。ただし、 html形式のformattedText文字列には、着色タグは含まれていません。

4

2 に答える 2

4

さて、いくつかの実験の後、Qt Creator のコードの一部を操作して、QSyntaxHighlighter 派生クラスで使用できる便利なものにしました。ドキュメントで他のデフォルトの前景色と背景色を使用したくない場合は、tempCursor.setCharFormat() と blockFormat.setBackground() の部分をスキップしてください。これで問題なく動作するので、試してみてください。

void MyHighlighter::asHtml(QString& html)
{
    // Create a new document from all the selected text document.
    QTextCursor cursor(document());
    cursor.select(QTextCursor::Document);
    QTextDocument* tempDocument(new QTextDocument);
    Q_ASSERT(tempDocument);
    QTextCursor tempCursor(tempDocument);

    tempCursor.insertFragment(cursor.selection());
    tempCursor.select(QTextCursor::Document);
    // Set the default foreground for the inserted characters.
    QTextCharFormat textfmt = tempCursor.charFormat();
    textfmt.setForeground(Qt::gray);
    tempCursor.setCharFormat(textfmt);

    // Apply the additional formats set by the syntax highlighter
    QTextBlock start = document()->findBlock(cursor.selectionStart());
    QTextBlock end = document()->findBlock(cursor.selectionEnd());
    end = end.next();
    const int selectionStart = cursor.selectionStart();
    const int endOfDocument = tempDocument->characterCount() - 1;
    for(QTextBlock current = start; current.isValid() and current not_eq end; current = current.next()) {
        const QTextLayout* layout(current.layout());

        foreach(const QTextLayout::FormatRange &range, layout->additionalFormats()) {
            const int start = current.position() + range.start - selectionStart;
            const int end = start + range.length;
            if(end <= 0 or start >= endOfDocument)
                continue;
            tempCursor.setPosition(qMax(start, 0));
            tempCursor.setPosition(qMin(end, endOfDocument), QTextCursor::KeepAnchor);
            tempCursor.setCharFormat(range.format);
        }
    }

    // Reset the user states since they are not interesting
    for(QTextBlock block = tempDocument->begin(); block.isValid(); block = block.next())
        block.setUserState(-1);

    // Make sure the text appears pre-formatted, and set the background we want.
    tempCursor.select(QTextCursor::Document);
    QTextBlockFormat blockFormat = tempCursor.blockFormat();
    blockFormat.setNonBreakableLines(true);
    blockFormat.setBackground(Qt::black);
    tempCursor.setBlockFormat(blockFormat);

    // Finally retreive the syntax higlighted and formatted html.
    html = tempCursor.selection().toHtml();
    delete tempDocument;
} // asHtml
于 2013-04-04T10:40:57.460 に答える
0

おそらく、使用するエンコーディングを指定する必要があります...

http://qt-project.org/doc/qt-4.8/qtextdocument.html#toHtml

http://qt-project.org/doc/qt-4.8/richtext-html-subset.html

Qt Creator は何らかの方法でそれを行います (テキストを C++ エディターからコピーし、それを他のリッチ テキスト エディターにコピーすると、強調表示されます)...

cpp エディターのソースは次のとおりです。

http://qt.gitorious.org/qt-creator/qt-creator/trees/master/src/plugins/cppeditor

ソースで Qt Creator がどこでそれを行っているかまだわかりません...

このようなことを行う 1 つの方法は、独自の html タグを に作成し、QSyntaxHighligher::highlightBlock()それらをテキストのコピーに挿入して、個別に保存することです。

http://qt-project.org/doc/qt-4.8/qsyntaxhighlighter.html#highlightBlock

次に、エクスポートする必要がある場合は、サブクラス化された で、QSyntaxHighlighter生成した保存された html テキストにアクセスします。

それが役立つことを願っています。

于 2013-03-07T20:06:15.650 に答える