性能有待提高;
能够读取指定目录下的日志文件,显示在下拉框中。
选择某一个日志之后,点击获取数据按钮,能够实时刷新日志内容。
但是每次刷新都会对整个文件进行读取,文本框重新加载文本。效率很低,影响性能。
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QList>
#include<QDir>
#include<QTime>
#include<QDateTime>
#include<QDebug>
#include<QFile>
#include<QFileSystemWatcher>
#define TIMEOUT 100
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
void getFileName(QString *path);
void setTextBrowser(QString *path);
//virtual void timerEvent(QTimerEvent *event);
//int myTimerID;
~Widget();
signals:
void setFileSignal();
private slots:
void on_readBtn_clicked();
void on_stopBtn_clicked();
void setFileSlot();//将文件名保存到List中
void fileUpdated(const QString &path); // 文件被修改时调用,path是监控的路径
private:
Ui::Widget *ui;
QList<QString> filenames;
QFileSystemWatcher fileSystemWatch;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QString floderPath = QDir::currentPath()+"/debug/14";
getFileName(&floderPath);
connect(this,&Widget::setFileSignal,this,&Widget::setFileSlot);
//布置监视文本初始化
fileSystemWatch.addPaths(filenames);
//qDebug()<<floderPath;
//fileSystemWatch.thread();
connect(&fileSystemWatch, &QFileSystemWatcher::fileChanged, this,&Widget::fileUpdated);
}
Widget::~Widget()
{
delete ui;
fileSystemWatch.removePaths(filenames);
}
void Widget::getFileName(QString *path)
{
QString LogPath = *path;//文件夹路径
QDir dir(LogPath);
QStringList LogList;
//向字符串列表添加文件类型,可以在此处添加过滤,只显示单日日志
LogList << "*.log" ;
QDateTime ct = QDateTime::currentDateTime();
QDate dt = ct.date();
//只看今天的
//QString filterName = "*"+QString::number(dt.day())+".log";
//LogList << "*" << QString::number(dt.day()) <<".log" ;
//LogList.append(filterName);
dir.setNameFilters(LogList);//获得文件夹下日志的名字
int LogCount = dir.count();//获得dir里名字的个数,也表示文件夹下图片的个数
/************获得文件名,对dir进行下标访问即可************/
for (int i=0;i < LogCount;i++)
{
QString LogName = dir[i];
ui->comboBox->addItem(LogName);
filenames.append(QDir::currentPath()+"/debug/14/"+LogName);
//qDebug() << LogName;//输出文件名
}
qDebug() << filenames;
//将文件名设置到下拉框
emit setFileSignal();
}
void Widget::setTextBrowser(QString *filename){
QString currrentfileName = QDir::currentPath()+"/debug/14/"+ui->comboBox->currentText();
QFile file(currrentfileName);
if(!file.isOpen()){
file.open(QIODevice::ReadOnly);
}
file.flush();
QByteArray ba = file.readAll();
file.close();
ui->textBrowser->setText(QString(ba));
ui->textBrowser->reload();
ui->textBrowser->moveCursor(QTextCursor::End);
}
void Widget::on_readBtn_clicked()
{
setTextBrowser(NULL);
//打开定时器
//myTimerID=this->startTimer(TIMEOUT);
//QFileSystemWatcher::removePaths();
//connect(this,&QFileSystemWatcher::fileChanged,this,&Widget::setTextBrowser);
}
/*void Widget::timerEvent(QTimerEvent *event)
{
if(event->timerId()!=myTimerID)
return;
setTextBrowser(NULL);
}*/
void Widget::on_stopBtn_clicked()
{
//this->killTimer(myTimerID);
}
//通过文件字符串列表,生成文件列表,且全部打开
void Widget::setFileSlot()
{
foreach (QString filename, filenames) {
QFile file(filename);
qDebug()<<filename;
}
}
void Widget::fileUpdated(const QString &path)
{
if(path==QDir::currentPath()+"/debug/14/"+ui->comboBox->currentText())
{
setTextBrowser(NULL);
}
}