QSyntaxHighlighter не создает QTextFragments - PullRequest
1 голос
/ 23 апреля 2019

Я работаю над подсветкой синтаксиса с помощью Qt, и я хотел добавить в нее модульные тесты, чтобы проверить, хорошо ли применяются форматы.Но мне не удается разделить блок на форматы.Я использую QTextBlock и QTextFragment, но он не работает, пока документ QTextFragment говорит:

Фрагмент текста описывает фрагмент текста, который хранится в формате одного символа.

Вот код в исполняемом файле main.cpp:

#include <QApplication>
#include <QTextEdit>
#include <QSyntaxHighlighter>
#include <QRegularExpression>
#include <QDebug>

class Highlighter : public QSyntaxHighlighter
{
public:

    Highlighter(QTextDocument *parent)
        : QSyntaxHighlighter(parent)
    {}

protected:

    void highlightBlock(const QString& text) override
    {
        QTextCharFormat classFormat;
        classFormat.setFontWeight(QFont::Bold);

        QRegularExpression pattern { "\\bclass\\b" };

        QRegularExpressionMatchIterator matchIterator = pattern.globalMatch(text);
        while (matchIterator.hasNext())
        {
            QRegularExpressionMatch match = matchIterator.next();
            setFormat(match.capturedStart(), match.capturedLength(), classFormat);
        }


        // ==== TESTS ==== //

        qDebug() << "--------------------------------";
        QTextDocument *doc = document();

        QTextBlock currentBlock = doc->firstBlock();

        while (currentBlock.isValid()) {
            qDebug() << "BLOCK" << currentBlock.text();

            QTextBlockFormat blockFormat = currentBlock.blockFormat();
            QTextCharFormat charFormat = currentBlock.charFormat();
            QFont font = charFormat.font();

            // each QTextBlock holds multiple fragments of text, so iterate over it:
            QTextBlock::iterator it;
            for (it = currentBlock.begin(); !(it.atEnd()); ++it) {
                QTextFragment currentFragment = it.fragment();
                if (currentFragment.isValid()) {
                    // a text fragment also has a char format with font:
                    QTextCharFormat fragmentCharFormat = currentFragment.charFormat();
                    QFont fragmentFont = fragmentCharFormat.font();

                    qDebug() << "FRAGMENT" << currentFragment.text();
                }
            }

            currentBlock = currentBlock.next();
        }
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    auto *textEdit = new QTextEdit;
    auto *highlighter = new Highlighter(textEdit->document());
    Q_UNUSED(highlighter);

    textEdit->setText("a class for test");

    textEdit->show();

    return a.exec();
}

И он выводит только один блок «класс для теста» и один формат «класс для теста», в то время какключевое слово класса выделено жирным шрифтом.

Спасибо за помощь!

1 Ответ

1 голос
/ 24 апреля 2019

Хорошо, я нашел это из документации QSyntaxHighlighter :: setFormat :

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

Форматы, применяемые подсветкой синтаксиса, хранятся не в QTextBlock :: charFormat, а в дополнительных форматах:

QVector<QTextLayout::FormatRange> formats = textEdit->textCursor().block().layout()->formats();
...