QT实时显示日志内容

news/2024/10/29 23:41:57/

性能有待提高;
能够读取指定目录下的日志文件,显示在下拉框中。
选择某一个日志之后,点击获取数据按钮,能够实时刷新日志内容。
但是每次刷新都会对整个文件进行读取,文本框重新加载文本。效率很低,影响性能。

#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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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);}
}

在这里插入图片描述


http://www.ppmy.cn/news/1542936.html

相关文章

【C++初阶】模版入门看这一篇就够了

文章目录 1. 泛型编程2. 函数模板2. 1 函数模板概念2. 2 函数模板格式2. 3 函数模板的原理2. 4 函数模板的实例化2. 5 模板参数的匹配原则2. 6 补充&#xff1a;使用调试功能观察函数调用 3. 类模板3 .1 类模板的定义格式3. 2 类模板的实例化 1. 泛型编程 在C语言中&#xff0…

.NET 8 中的 Mini WebApi

介绍 .NET 8 中的极简 API 隆重登场&#xff0c;重新定义了我们构建 Web 服务的方式。如果您想知道极简 API 的工作原理以及它们如何简化您的开发流程&#xff0c;让我们通过一些引人入胜的示例来深入了解一下。 .NET 极简主义的诞生 想想我们曾经不得不为一个简单的 Web 服务…

OpenCV通道拆分:深入理解图像处理

在图像处理中&#xff0c;通道拆分是一项基本而重要的操作。它允许我们分别处理图像的每个颜色通道&#xff0c;从而实现更精细的图像分析和处理。OpenCV&#xff0c;作为一个强大的计算机视觉库&#xff0c;提供了多种方法来实现通道拆分。在本文中&#xff0c;我们将通过一个…

【JavaEE】【多线程】定时器

目录 一、定时器简介1.1 Timer类1.2 使用案例 二、实现简易定时器2.1 MyTimerTask类2.2 实现schedule方法2.3 构造方法2.4 总代码2.5 测试 一、定时器简介 定时器&#xff1a;就相当于一个闹钟&#xff0c;当我们定的时间到了&#xff0c;那么就执行一些逻辑。 1.1 Timer类 …

912.排序数组(桶排序)

目录 题目解法 题目 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题&#xff0c;时间复杂度为 O(nlog(n))&#xff0c;并且空间复杂度尽可能小。 解法 class Solution { public:vector<int> sortArray(vect…

Java应用程序的测试覆盖率之设计与实现(四)-- jacoco-maven-plugin

说在前面的话 加载jacocoagent,开始采集覆盖率数据。 java -javaagent:doc/jacocoagent.jar=includes=com.jacoco.*,output=tcpserver,port=7195,address=172.27.3.242,classdumpdir=classdumpdir/classes/ \ -jar target/jacoco-test-sample.jar. ____ _ …

ELK同时采集Nginx、linux内核日志信息

在logstash服务机器136上安装nginx(配置ELK服务在上一篇文档中&#xff09; 复制之前写的linux内核日志采集配置文档改名字为linux_nginx.conf 编辑linux_nginx.conf 修改完成后启动nginx服务 重新加载linux_nginx.conf配置文件 看到有java进程说明logstash采集成功&#xff0c…

无人机遗传算法详解!

一、遗传算法概述 遗传算法是一种模拟自然选择和遗传机制的优化算法&#xff0c;它仿效生物的进化与遗传&#xff0c;根据生存竞争和优胜劣汰的法则&#xff0c;通过遗传操作&#xff08;选择、交叉、变异&#xff09;&#xff0c;使所求问题的解逐步逼近最优解。 二、无人机…