头文件
#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文件
#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
#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字符串匹配修改查找方案