0

我有一个极简的工作 Qt 代码。我想突出显示以“/”开头并以“/ ”结尾的标准多行样式 C++ 注释行。

Qt 项目以零警告编译并且运行良好。但是突出显示仅发生在字符上,而不是整个背景区域。

预期的行为以 png 图像的形式附加。该代码基于带有 MinGw x64 编译器的Qt 文档版本 5.13 。

我还要感谢 stackoverflow 贡献者https://stackoverflow.com/users/6622587/eyllanesc建议我使用两个正则表达式来突出显示。

此代码的输出:

仅突出显示字符

我的预期输出:

我希望突出显示完整的背景

完整的工作代码清单如下。请建议和帮助。提前致谢。

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTextEdit>
#include "mysyntaxhighlighter.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    mySyntaxHighlighter *myHighlighter;
    QTextEdit *te;
};

#endif // MAINWINDOW_H

主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mysyntaxhighlighter.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    te = new QTextEdit(this);
    te->setAcceptRichText(false);
    te->setFontPointSize(16);
    myHighlighter = new mySyntaxHighlighter(te->document());
    setCentralWidget(te);
    setMinimumWidth(1200);
    te->setFocus();

    te->append("\n/*\nFirst line\nSecond line\nThird line\netc.\n*/\n");
}

MainWindow::~MainWindow()
{
    delete ui;
}

mySyntaxHighlighter.h

#ifndef MYSYNTAXHIGHLIGHTER_H
#define MYSYNTAXHIGHLIGHTER_H

#include <QObject>
#include <QSyntaxHighlighter>
#include <QTextCharFormat>
#include <QRegularExpression>

class mySyntaxHighlighter : public QSyntaxHighlighter
{
    Q_OBJECT
public:
    explicit mySyntaxHighlighter(QTextDocument *document);

private:
        QTextCharFormat f;
        QRegularExpression  regex1, regex2;
        QBrush  b;

signals:

public slots:

protected:
    void highlightBlock(const QString &text);
};

#endif // MYSYNTAXHIGHLIGHTER_H

mySyntaxHighlighter.cpp

#include "mysyntaxhighlighter.h"

mySyntaxHighlighter::mySyntaxHighlighter(QTextDocument *document) : QSyntaxHighlighter(document)
{
    b.setColor(Qt::yellow);
    b.setStyle(Qt::SolidPattern);
    f.setBackground(b);
    f.setForeground(Qt::blue);
    f.setFontFamily("Courier New");
    f.setFontPointSize(16);

    regex1 = QRegularExpression(QStringLiteral("/\\*"));
    regex2 = QRegularExpression(QStringLiteral("\\*/"));
}

void mySyntaxHighlighter::highlightBlock(const QString &text) {
    setCurrentBlockState(0);

    QRegularExpressionMatch match;
    int startIndex = 0;

    if (previousBlockState() != 1) {
        startIndex = text.indexOf(regex1);
    }

    while (startIndex >= 0) {
        match = regex2.match(text, startIndex);
        int endIndex = match.capturedStart();
        int Length = 0;
        if (endIndex == -1) {
            setCurrentBlockState(1);
            Length = text.length() - startIndex;
        }
        else {
            Length = endIndex - startIndex + match.capturedLength();
        }

        setFormat(startIndex, Length, f);
        startIndex = text.indexOf(regex1, startIndex + Length);
    }
}
4

1 回答 1

0

在更改文本属性之前,您必须从 textDocument 中创建一个光标,例如

QTextCursor highlightCursor = QTextCursor(document)

然后将格式放在光标上

QTextCharFormat plainFormat(highlightCursor.charFormat());
QTextCharFormat colorFormat = plainFormat;
colorFormat.setBackground(QColor(Qt::yellow));

使用此光标,您可以在文档中移动并操作文本

highlightCursor = document->find(regexp,highlightCursor)

你可以在这里找到一个很好的例子textfinder example

顺便说一句,我认为,它是只使用一个正则表达式的更好方法

\/\*.*?\*\\s

应该匹配整个评论

于 2019-07-29T17:49:12.720 回答