C++ QTextEdit不高亮显示简单的两行。我正在对Qt 5.13 MinGw x64使用QRegularExpression

C++ QTextEdit不高亮显示简单的两行。我正在对Qt 5.13 MinGw x64使用QRegularExpression,c++,qt,qt5,qtextedit,qregularexpression,C++,Qt,Qt5,Qtextedit,Qregularexpression,我有一个最简单的最小工作示例来突出显示两行。下面显示了要高亮显示的两行。这两行是QTextEdit的唯一内容 开始 结束 使用QSyntaxHighlighter和qtexdit,我无法使用QRegularExpression突出显示这两行。工作代码如下所示。当使用QtCreater编译时,它不会给出任何警告,并且运行良好。我使用的是Qt5.13 MinGW x64。有趣的一点是,我使用的正则表达式在在线检查器中运行良好 最后,我希望看到这两行应该以红色显示。第一行包含单词“开始”,第二行包

我有一个最简单的最小工作示例来突出显示两行。下面显示了要高亮显示的两行。这两行是QTextEdit的唯一内容


开始

结束


使用QSyntaxHighlighter和qtexdit,我无法使用QRegularExpression突出显示这两行。工作代码如下所示。当使用QtCreater编译时,它不会给出任何警告,并且运行良好。我使用的是Qt5.13 MinGW x64。有趣的一点是,我使用的正则表达式在在线检查器中运行良好

最后,我希望看到这两行应该以红色显示。第一行包含单词“开始”,第二行包含单词“结束”。*请帮助

mySyntaxHighlighter.h

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

signals:

public slots:

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

#include "mysyntaxhighlighter.h"

mySyntaxHighlighter::mySyntaxHighlighter(QTextDocument *document) : QSyntaxHighlighter(document)
{

}

void mySyntaxHighlighter::highlightBlock(const QString &text) {
    QTextCharFormat citeFormat;
    citeFormat.setForeground(QColor(Qt::red));
    citeFormat.setFontFamily("Consolas");
    citeFormat.setFontPointSize(14);

    QRegularExpression regex = QRegularExpression(QStringLiteral("begin(.*\n)+end"));
    regex.setPatternOptions(QRegularExpression::DotMatchesEverythingOption);

    QRegularExpressionMatchIterator i = regex.globalMatch(text);

    while (i.hasNext()) {
        QRegularExpressionMatch match = i.next();
        setFormat(match.capturedStart(), match.capturedLength(), citeFormat);
    }
}
mainwindow.cpp

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


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

    QTextEdit *te = new QTextEdit(this);
    te->setAcceptRichText(false);
    te->setFontFamily("Consolas");
    te->setFontPointSize(14);
    te->setMinimumSize(1200, 600);

    myHighlighter = new mySyntaxHighlighter(te->document());

    setCentralWidget(te);
    setMinimumWidth(1200);
    te->setFocus();
}
主窗口

#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;
};
#包括
#包括
#包括“mysyntaxhighlighter.h”
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=nullptr);
~main窗口();
私人:
Ui::MainWindow*Ui;
mySyntaxHighlighter*myHighlighter;
};

您假设文本是所有文本,但它只是一个块,我怀疑您的要求:如果“开始”和“结束”在同一行,是否应该突出显示?如果只有“开始”,那么必须突出显示以下文本,或者必须是“结束”?我问的最后一件事是,例如,C++编辑器通常会突出显示文本刚刚找到的注释“/*”,并在有“/”时完成,例如,文本可以以“/”开头,因此如果没有“*/”,所有文本都将突出显示。我的意思是,所有介于“开始”和“结束”之间的文本都应该突出显示。我使用非常简单的案例进行测试,但它们之间没有任何差异。另外,正如您所说,当“开始”和“结束”在同一行时,它会高亮显示。但这并不是必需的,因为他们将在不同的线路上。你的类比也是正确的,即“/*”相当于“开始”,“*/”相当于“结束”。但底线是,我试图用一个正则表达式来实现。你不能用一个正则表达式来实现,请查看Qt提供的第二个示例:谢谢。因此,如果您确认我们必须使用两个正则表达式来解决问题,那么,我将放弃这种方法。这里的主要吸引力在于“DotMatchesEverythingOption”选项。此外,在线正则表达式检查器按预期工作。谢谢您提供的信息。您假设文本是所有文本,但它只是一个块,我对您的要求有疑问:如果“开始”和“结束”在同一行,它们是否应该突出显示?如果只有“开始”,那么必须突出显示以下文本,或者必须是“结束”?我问的最后一件事是,例如,C++编辑器通常会突出显示文本刚刚找到的注释“/*”,并在有“/”时完成,例如,文本可以以“/”开头,因此如果没有“*/”,所有文本都将突出显示。我的意思是,所有介于“开始”和“结束”之间的文本都应该突出显示。我使用非常简单的案例进行测试,但它们之间没有任何差异。另外,正如您所说,当“开始”和“结束”在同一行时,它会高亮显示。但这并不是必需的,因为他们将在不同的线路上。你的类比也是正确的,即“/*”相当于“开始”,“*/”相当于“结束”。但底线是,我试图用一个正则表达式来实现。你不能用一个正则表达式来实现,请查看Qt提供的第二个示例:谢谢。因此,如果您确认我们必须使用两个正则表达式来解决问题,那么,我将放弃这种方法。这里的主要吸引力在于“DotMatchesEverythingOption”选项。此外,在线正则表达式检查器按预期工作。谢谢你的信息。