Qt遍历文本搜索关键字

转自:http://cool.worm.blog.163.com/blog/static/64339006200842633913611/

在项目开发中,经常有一些特殊的需求,基本上没人帮助,也许仅仅是几段代码,可能要自己搞上一阵子!
也许Qt的例子程序会为你提供些答案,利用QSyntaxHighlighter类文本中指定特殊字段特显。
$QTDIR\examples\richtext\syntaxhighlighter,是个很好的示例。
相信"Visual Assist X"这个Visual C++插件很多人都不陌生,也许在示例中你能找到通过Qt实现遍历文本搜索关键字的答案。

Qt遍历文本搜索关键字_第1张图片

第一次贴图还挺成功,^_^ ,当然这里还是用一个简单化的代码对QSyntaxHighlighter类进行讲解!

 QSyntaxHighlighter类的关键是virtual void highlightBlock( const QString & text ) = 0;这里纯虚函数;
这意味着QSyntaxHighlighter类是一个抽象类,所以必须自己写个相关的类,继承QSyntaxHighlighter类,并在当中实现highlightBlock()这个函数。并且与相应的文本或文档(QTextEdit、QTextDocument)关联在一起。

先写一个Highlighter类,目的是让文本中能够对指定的关键字进行特定颜色的显示;

//highlighter.h头文件部分
#include
#include
#include
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 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
#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

#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
#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()来清空特显效果。

你可能感兴趣的:(qt)