c++ 如何在Qt文本编辑器应用程序中突出显示特定的关键字

rdlzhqv9  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(171)

我已经建立了一个简单的Qt文本编辑器应用程序,我想它突出显示/粗体某些关键字。我有下面的highlight函数,每次键入一个字母和打开文件时都会调用它:

void objectDetector::highlightKeywords()
{

 QString text = ui->textEdit->toPlainText();

// keywords
QStringList keywords;
keywords << "red" << "bold";  

// Define text formats for highlighting
QTextCharFormat keywordFormat;
keywordFormat.setForeground(Qt::red);
keywordFormat.setFontWeight(QFont::Bold);

// Iterate over keywords and apply formatting
for (const QString& keyword : keywords) {
    QTextDocument* document = ui->textEdit->document();
    QTextCursor cursor(document);

    while (!cursor.isNull() && !cursor.atEnd()) {
        cursor = document->find(keyword, cursor, QTextDocument::FindWholeWords);

        if (!cursor.isNull()) {
            cursor.mergeCharFormat(keywordFormat);
        }
    }
}
}

只要找到一个关键字,程序就会崩溃。当在调试模式下运行时,它表示发生了seg错误。
编辑:问题可能是在cursor.mergeCharFormat(keywordFormat)周围,因为我在它后面添加了一个cout行,它从来没有被调用过,但是循环中它之前的行被反复调用了几次,也许可以解释seg错误?

ejk8hzay

ejk8hzay1#

正确的方法是使用QSyntaxHighlighter,例如:

class MySyntaxHighlighter : public QSyntaxHighlighter {
public:
    MySyntaxHighlighter(QObject* parent) : QSyntaxHighlighter(parent)
    {
        KeywordsRed.push_back (
            QRegularExpression(
                "\\bred\\b",
                QRegularExpression::PatternOption::CaseInsensitiveOption
            )
        );
        KeywordsBold.push_back(
            QRegularExpression(
                "\\bbold\\b",
                QRegularExpression::PatternOption::CaseInsensitiveOption
            )
        );
    }
    virtual void highlightBlock(const QString& text) override
    {
        QTextCharFormat redFormat, boldFormat;
        redFormat.setForeground(QBrush(QColor::fromRgb(200, 0, 0)));
        if (auto textEdit = dynamic_cast<QTextEdit*>(parent()); textEdit) {
            QFont font = textEdit->font(); font.setBold(true);
            boldFormat.setFont(font);
        }
        for (const QRegularExpression& regexp : std::as_const(KeywordsRed)) {
            QRegularExpressionMatchIterator matchIterator = regexp.globalMatch(text);
            while (matchIterator.hasNext()) {
                QRegularExpressionMatch match = matchIterator.next();
                setFormat(match.capturedStart(), match.capturedLength(), redFormat);
            }
        }
        for (const QRegularExpression& regexp : std::as_const(KeywordsBold)) {
            QRegularExpressionMatchIterator matchIterator = regexp.globalMatch(text);
            while (matchIterator.hasNext()) {
                QRegularExpressionMatch match = matchIterator.next();
                setFormat(match.capturedStart(), match.capturedLength(), boldFormat);
            }
        }
    }
private:
    std::vector<QRegularExpression> KeywordsRed, KeywordsBold;
};

只需在QTextEdit上创建荧光笔即可附加荧光笔:

auto highlighter = new (std::nothrow) MySyntaxHighlighter(edit);

相关问题