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

相关推荐
luquinn14 分钟前
实现统一门户登录跳转免登录
开发语言·前端·javascript
Forward♞15 分钟前
Qt——界面美化 QSS
开发语言·c++·qt
##学无止境##3 小时前
解锁Java分布式魔法:CAP与BASE的奇幻冒险
java·开发语言·分布式
做一位快乐的码农3 小时前
基于Spring Boot的旅行足迹分享社区的设计与实现/基于java的在线论坛系统
java·开发语言·spring boot
code bean7 小时前
【C#】获取不重复的编码(递增,非GUID)
开发语言·c#
阿里嘎多哈基米7 小时前
二、JVM 入门——(三)栈
java·开发语言·jvm·线程·
MonkeyKing_sunyuhua8 小时前
什么是JSON-RPC 2.0,在项目中应该怎么使用
qt·rpc·json
雷达学弱狗8 小时前
anaconda本身有一个python环境(base),想用别的环境就是用anaconda命令行往anaconda里创建虚拟环境
开发语言·python
燃尽余火8 小时前
Knife4j 文档展示异常的小坑
java·开发语言·spring
爬虫程序猿9 小时前
利用 Java 爬虫按关键字搜索 1688 商品详情 API 返回值说明实战指南
java·开发语言·爬虫