当前位置: 首页 > article >正文

QT实时显示日志内容

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

#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);
    }
}

在这里插入图片描述


http://www.kler.cn/a/370909.html

相关文章:

  • React封装倒计时按钮
  • Redis集群部署详解:主从复制、Sentinel哨兵模式与Cluster集群的工作原理与配置
  • Git 合并和 Git 变基有什么区别?
  • qml LevelAdjust详解
  • 使用 Charles 调试 Flutter 应用中的 Dio 网络请求
  • Python文件操作中编码解码问题
  • Rust实现Kafka - 前言
  • 特斯拉与 SK hynix 的潜在交易
  • 代码随想录 | Day35 | 动态规划 :最小花费爬楼梯不同路径不同路径II
  • 2-133 基于matlab的粒子群算法PSO优化BP神经网络
  • 云手机简述(概况,使用场景,自己部署云手机)
  • LabVIEW汽车状态监测系统
  • 【SSM详细教程】-14-SpringAop超详细讲解
  • 基于SSM+小程序的智慧旅游平台登录管理系统(旅游2)
  • XJ02、消费金融|消费金融业务模式中的主要主体
  • 刷爆leetcode Day12 DP
  • 基础数据结构——二叉树(深度优先遍历,前序遍历,中序遍历,后序遍历)
  • 【数据结构】顺序表和链表
  • IFC模型文本的含义
  • 【336】基于springboot的社区物资交易互助平台
  • linux查看文件命令
  • 创建型模式-----建造者模式
  • 金蝶云星空采购退料单集成易仓出库单实现高效数据对接
  • 安宝特分享 | AR技术引领:跨国工业远程协作创新模式
  • goalng框架Gin解析
  • Python小白学习教程从入门到入坑------第十八课 异常模块与包【上】(语法基础)