转自:http://cool.worm.blog.163.com/blog/static/64339006200842633913611/
在项目开发中,经常有一些特殊的需求,基本上没人帮助,也许仅仅是几段代码,可能要自己搞上一阵子!
也许Qt的例子程序会为你提供些答案,利用QSyntaxHighlighter类文本中指定特殊字段特显。
$QTDIR\examples\richtext\syntaxhighlighter,是个很好的示例。
相信"Visual Assist X"这个Visual C++插件很多人都不陌生,也许在示例中你能找到通过Qt实现遍历文本搜索关键字的答案。
第一次贴图还挺成功,^_^ ,当然这里还是用一个简单化的代码对QSyntaxHighlighter类进行讲解!
QSyntaxHighlighter类的关键是virtual void highlightBlock( const QString & text ) = 0;这里纯虚函数;
这意味着QSyntaxHighlighter类是一个抽象类,所以必须自己写个相关的类,继承QSyntaxHighlighter类,并在当中实现highlightBlock()这个函数。并且与相应的文本或文档(QTextEdit、QTextDocument)关联在一起。
先写一个Highlighter类,目的是让文本中能够对指定的关键字进行特定颜色的显示;
//highlighter.h头文件部分
#include <QSyntaxHighlighter>
#include <QHash>
#include <QTextCharFormat>
class QTextDocument;class Highlighter : public QSyntaxHighlighter
{
public:
Highlighter(QTextEdit *parent = 0);
void highlightBlock(const QString &text);
//添加指定规则,对指定的关键字进行,特定颜色的显示
void setColorText(const QString &str, const QColor &color);
//清空所有规则
void clearRules();private:
struct HighlightingRule
{
QRegExp pattern;
QTextCharFormat format;
};
QVector<HighlightingRule> highlightingRules;
};//highlighter.cpp源文件部分
#include "highlighter.h"Highlighter::Highlighter(QTextEdit *parent)
: QSyntaxHighlighter(parent)
{
highlightingRules.clear();
}void Highlighter::highlightBlock(const QString &text)
{
foreach (HighlightingRule rule, highlightingRules)
{
QRegExp expression(rule.pattern);
int index = text.indexOf(expression);
while (index >= 0)
{
int length = expression.matchedLength();
setFormat(index, length, rule.format);
index = text.indexOf(expression, index + length);
}
}
}void Highlighter::SetColorText(const QString &str, const QColor &color)
{
HighlightingRule rule;
rule.pattern = QRegExp("\\b"+str+"\\b");
QTextCharFormat format;
format.setForeground(color);
rule.format = format;
highlightingRules.append(rule);
}void Highlighter::clearRules()
{
highlightingRules.clear();
}
下面写一个MainWindow类,通过打开的*.txt文件,当中若有"vic.MINg"显示出蓝色。
#include <QMainWindow>
#include "highlighter.h"
class QTextEdit;//mainwindow.h头文件
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);public slots:
void newFile();
void openFile(const QString &path = QString());private:
void setupEditor();
void setupFileMenu();QTextEdit *editor;
Highlighter *highlighter;
};//mainwindow.cpp源文件
#include <QtGui>#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setupFileMenu();
setupEditor();setCentralWidget(editor);
setWindowTitle(tr("Syntax Highlighter"));
}void MainWindow::newFile()
{
editor->clear();
}void MainWindow::openFile(const QString &path)
{
QString fileName = path;if (fileName.isNull())
fileName = QFileDialog::getOpenFileName(this,
tr("Open File"), "", "txt Files (*.txt)");if (!fileName.isEmpty()) {
QFile file(fileName);
if (file.open(QFile::ReadOnly | QFile::Text))
editor->setPlainText(file.readAll());
}
}void MainWindow::setupEditor()
{
QFont font;
font.setFamily("Courier");
font.setFixedPitch(true);
font.setPointSize(10);editor = new QTextEdit;
editor->setFont(font);highlighter = new Highlighter(editor);
highlighter->setColorText("vic.MINg", Qt::blue);
}void MainWindow::setupFileMenu()
{
QMenu *fileMenu = new QMenu(tr("&File"), this);
menuBar()->addMenu(fileMenu);fileMenu->addAction(tr("&New"), this, SLOT(newFile()),
QKeySequence(tr("Ctrl+N", "File|New")));
fileMenu->addAction(tr("&Open..."), this, SLOT(openFile()),
QKeySequence(tr("Ctrl+O", "File|Open")));
fileMenu->addAction(tr("E&xit"), qApp, SLOT(quit()),
QKeySequence(tr("Ctrl+Q", "File|Exit")));
}
最后完成main()函数;
#include <QApplication>
#include "mainwindow.h"int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow window;
window.resize(640, 512);
window.show();
return app.exec();
}
其实比较懒,可以多做一个对话框,输入先关的关键字和颜色,然后让文本对特殊字段特显。用Highlighter::clearRules()来清空特显效果。