文本搜索程序(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字符串匹配修改查找方案

相关推荐
TechWJ20 分钟前
PyPTO编程范式深度解读:让NPU开发像写Python一样简单
开发语言·python·cann·pypto
lly20240643 分钟前
C++ 文件和流
开发语言
m0_706653231 小时前
分布式系统安全通信
开发语言·c++·算法
寻寻觅觅☆1 小时前
东华OJ-基础题-104-A == B ?(C++)
开发语言·c++
杨了个杨89821 小时前
memcached部署
qt·websocket·memcached
lightqjx2 小时前
【C++】unordered系列的封装
开发语言·c++·stl·unordered系列
zh_xuan2 小时前
kotlin lazy委托异常时执行流程
开发语言·kotlin
阿猿收手吧!2 小时前
【C++】string_view:高效字符串处理指南
开发语言·c++
玄同7653 小时前
我的 Trae Skill 实践|使用 UV 工具一键搭建 Python 项目开发环境
开发语言·人工智能·python·langchain·uv·trae·vibe coding
Yorlen_Zhang3 小时前
Python Tkinter Text 控件完全指南:从基础编辑器到富文本应用
开发语言·python·c#