文本搜索程序(Qt)

头文件

cpp 复制代码
#ifndef TEXTFINDER_H
#define TEXTFINDER_H

#include <QWidget>
#include <QFileDialog>
#include <QFile>
#include <QTextEdit>
#include <QLineEdit>
#include <QTextStream>
#include <QPushButton>
#include <QMessageBox>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui {
class textFinder;
}
QT_END_NAMESPACE

class textFinder : public QWidget
{
    Q_OBJECT

public:
    textFinder(QWidget *parent = nullptr);
    ~textFinder();

public slots:
    void lodeTextFile();

private:
    Ui::textFinder *ui;
    void searchText();
    bool search_flog;
};
#endif // TEXTFINDER_H

cpp文件

cpp 复制代码
#include "textfinder.h"
#include "./ui_textfinder.h"

textFinder::textFinder(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::textFinder)
{
    ui->setupUi(this);
    ui->textEdit->setReadOnly(true);
    connect(ui->loadFile,&QPushButton::clicked,[=](){
        lodeTextFile();
    });
    connect(ui->search,&QPushButton::clicked,[=](){
        searchText();
    });
}

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

void textFinder::lodeTextFile()//加载文本文件
{
    QString path = QFileDialog::getOpenFileName();
    if(!path.isEmpty())
    {
        QFile file(path);
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            QMessageBox::warning(this, tr("Read Text File"),
                                 tr("Cannot open file:\n%1").arg(path));
            return;
        }
        QTextStream in(&file);
        ui->textEdit->setText(in.readAll());//读取文本
        file.close();
    }
    else
    {
        QMessageBox::warning(this, tr("Path"),
                             tr("You did not select any file."));
    }

}

void textFinder::searchText()//查找文本
{
    if(ui->textEdit->document()->isEmpty() || ui->lineEdit->text().isEmpty())
    {
        QMessageBox::warning(this, tr("Warning"), "The text or searchline is empty!");
        return;
    }

    QString searchText = ui->lineEdit->text();
    QTextDocument* document = ui->textEdit->document();


    bool foundWholeWord = false;//查找标志位
    QTextCursor highlightCursor(document);//文本光标
    QTextCursor cursor(document);

    ui->textEdit->document()->undo(); // 清除之前的高亮
    cursor.beginEditBlock();

    QTextCharFormat plainFormat(highlightCursor.charFormat());//文本样式
    QTextCharFormat colorFormat = plainFormat;
    colorFormat.setForeground(Qt::red);//如果找到则置红

    while (!highlightCursor.isNull() && !highlightCursor.atEnd())
    {
        highlightCursor = document->find(searchText, highlightCursor);
        if (!highlightCursor.isNull())
        {
            foundWholeWord = true;
            highlightCursor.movePosition(QTextCursor::WordRight, QTextCursor::KeepAnchor);
            highlightCursor.mergeCharFormat(colorFormat);
        }
    }

    cursor.endEditBlock();

    if (!foundWholeWord) {
        QMessageBox::information(this, tr("Partial Match Found"),
                                 tr("The text '%1' was found as part of other words but not as a whole word.")
                                     .arg(searchText));
    }
}

main

cpp 复制代码
#include "textfinder.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    textFinder w;
    w.show();
    return a.exec();
}

功能:可查找想要收索的关键字,找到则标红

当前问题:如果给的文本例如:abcd efg,只搜索a时abcd会一起标红,或许是设置查找模式出了问题

解决方案:查看是否是查找模式设置出了问题,如不是,则可通过kmp字符串匹配修改查找方案

相关推荐
游乐码16 分钟前
c#泛型约束
开发语言·c#
Dontla28 分钟前
go语言Windows安装教程(安装go安装Golang安装)(GOPATH、Go Modules)
开发语言·windows·golang
chushiyunen28 分钟前
python rest请求、requests
开发语言·python
铁东博客34 分钟前
Go实现周易大衍筮法三变取爻
开发语言·后端·golang
baidu_huihui35 分钟前
在 CentOS 9 上安装 pip(Python 的包管理工具)
开发语言·python·pip
南 阳37 分钟前
Python从入门到精通day63
开发语言·python
lbb 小魔仙37 分钟前
Python_RAG知识库问答系统实战指南
开发语言·python
551只玄猫2 小时前
【数学建模 matlab 实验报告13】主成分分析
开发语言·数学建模·matlab·课程设计·主成分分析
zzzzls~2 小时前
Python 工程化: 用 Copier 打造“自我进化“的项目脚手架
开发语言·python·copier
韶博雅3 小时前
emcc24ai
开发语言·数据库·python