我有一个极简的工作 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);
}
}