QT项目:linux资源监视器



前言

该项目在linux下运用QT5.9进行编程,实现了实时监控cpu、mem、swap和网速的变化

本篇文章仅供本人备忘用


提示:以下是本篇文章正文内容,下面案例可供参考


一、首先是pro文件

需要在pro文件中加入charts

QT       += core gui charts

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    pie.cpp

HEADERS += \
    pie.h

FORMS += \
    pie.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target


二、头文件(.h)

导入相关的头文件,以及声明函数及变量

#ifndef PIE_H
#define PIE_H

#include <QMainWindow>
#include <QtCharts>
#include <QLineSeries>
#include <QValueAxis>
#include <QPushButton>

QT_BEGIN_NAMESPACE
namespace Ui { class Pie; }

QT_END_NAMESPACE

class Pie : public QMainWindow
{
    Q_OBJECT

public:
    Pie(QWidget *parent = nullptr);
    ~Pie();
    void CPU_Pie_chart();
    void Mem_pie_chart();
    void Swap_pie_chart();
    void Line_chart();
    void set_CPU(float id); //设置cpu饼图数据
    void set_Mem(int Memid,int Memuse);//设置Mem饼图数据
    void set_Swap(int Swapid,int Swapuse);//设置Swap饼图数据
    void Process_init(); //饼图进程初始化
    void Process_init_Net();//折线图进程初始化
    //翻页按钮
    void pushButton01();
    void pushButton02();
    void pushButton03();
    void set_Net(int X1,float y1,int x2,float y2);//设置折线图数据


public slots:
    void readRead();
    void Msg_timer_Fun();
    void Msg_timer_Fun_Net();

private:
    Ui::Pie *ui;
    QProcess *process;//饼图进程
    QProcess *processNet;//折线图进程
    QPieSeries *CPU_series ; //Cpu饼图数据
    QByteArray msg;//char型字符 饼图信息
    QByteArray msgNet;//char字符 折线图信息
    QChart * CPU_chart ; //CPU饼图
    QTimer Msg_timer;  //定时器
    //Mem
    QPieSeries *Mem_series;//Men饼图数据
    QChart *Mem_chart ;//Mem饼图
    //Swap
    QPieSeries *Swap_series;//Swap饼图数据
    QChart *Swap_chart ;//Swap饼图
    //折线图
    QChart *Net_chart;//折线图
    QLineSeries *Net_serial_rx;
    QLineSeries *Net_serial_tx;
    QValueAxis *axisX;
    QValueAxis *axisY;


    uint rx_bytes;
    uint tx_bytes;
    uint last_rx_bytes;
    uint last_tx_bytes;
    uint rx_rate;
    uint tx_rate;
    float rx;
    float tx;

    //QVector是QT中容器中的一种  对象存储在连续的内存中,可以使用索引号访问
    //QPointF类使用浮点数定义平面中的点  QPoint就是整数
    QVector<QPointF> Net_data_rx;
    QVector<QPointF> Net_data_tx;



};
#endif // PIE_H

三、cpp文件(注意这不是main.cpp文件)

#include "pie.h"
#include "ui_pie.h"

Pie::Pie(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::Pie)
{
    ui->setupUi(this);
    //设置开始页面为第一页
    ui->stackedWidget->setCurrentIndex(0);
    //创建CPU饼图
    CPU_Pie_chart();
    //创建Mcm饼图
    Mem_pie_chart();
    //创建Swap饼图
    Swap_pie_chart();
    //创建折线图
    Line_chart();
    //饼图进程初始化
    Process_init();
    //折线图进程初始化
    Process_init_Net();
    connect(ui->btn1, &QPushButton::clicked,this, &Pie::pushButton01);
    connect(ui->btn2, &QPushButton::clicked,this, &Pie::pushButton02);
    connect(ui->btn3, &QPushButton::clicked,this, &Pie::pushButton03);

}
//饼图进程初始化
void Pie::Process_init()
{
    //新建饼图进程
    process = new QProcess();
    //数据接收槽函数连接
    connect(process, SIGNAL(readyRead()), this, SLOT(readRead()));
    //禁止当前进程,使其立即退出
    process->kill();
    //开始进行查询指令
    process->start("top -b -n 1");
    //资源、进程定时查询
    Msg_timer.setInterval(1000);//1000ms触发一次每一秒
    //连接定时器定时触发信号和槽函数
    connect(&Msg_timer,SIGNAL(timeout()),this,SLOT(Msg_timer_Fun()));
    //启动定时器
    Msg_timer.start();

}

//折线图进程初始化
void Pie::Process_init_Net(){
    //新建折线图进程
    processNet = new QProcess;
    //杀掉进程
    processNet->kill();//杀掉进程
    //开始查询
    processNet->start("cat /proc/net/dev");
    QByteArray msg = processNet->readAll();
    QString str(msg);
    //换行符分割
    QStringList msgList = str.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);
    for(int i=2;i<msgList.count();i++){
        QStringList netList = msgList[i].split(QRegExp("[\\s+]"),QString::SkipEmptyParts);

        if(netList[1]=="lo:"){
            continue;
        }

        rx_bytes = netList[1].toUInt();//接收
        tx_bytes = netList[9].toUInt();//发送
        qDebug()<<rx_bytes<<tx_bytes;

    }
    //定时器
    Msg_timer.setInterval(1000);

    connect(&Msg_timer,SIGNAL(timeout()),this,SLOT(Msg_timer_Fun_Net()));

    Msg_timer.start();

}

//折线图的定时处理和查询资源状态
void Pie::Msg_timer_Fun_Net(){
    processNet->kill();//杀掉进程
    processNet->start("cat /proc/net/dev");
    //等待获取信息完成
    processNet->waitForFinished();

    QByteArray msgNet = processNet->readAll();

    //记录上一次的点
    last_rx_bytes = rx_bytes;
    last_tx_bytes = tx_bytes;
    QString str(msgNet);
    QStringList msgList = str.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);
    for(int i=3;i<msgList.count();i++){
        QStringList netList = msgList[i].split(QRegExp("[\\s+]"),QString::SkipEmptyParts);

        if(netList[0]=="lo:"){
            continue;
        }

    rx_bytes = netList[1].toUInt();//接收
    tx_bytes = netList[9].toUInt();//发送
    }

    uint rx_rate = rx_bytes - last_rx_bytes;
    uint tx_rate = tx_bytes - last_tx_bytes;
    set_Net(0,(float)rx_rate/1024.0,0,(float)tx_rate/1024.0);
}

//CPU饼图创建
void Pie::CPU_Pie_chart()
{
    //分配新对象
    CPU_chart = new QChart();
    CPU_series = new QPieSeries(CPU_chart);
    //启动OpenGL加速
    CPU_series->setUseOpenGL(true);
    //设置控件外边界全部为0
    CPU_chart->layout()->setContentsMargins(0, 0, 1, 0);
    //设置内边界全部为0
    CPU_chart->setMargins(QMargins(0, 0, 0, 0));
    //设置背景区域无圆角
    CPU_chart->setBackgroundRoundness(0);
    //设置白色主题
    CPU_chart->setTheme(QChart::ChartThemeLight);
    //设置背景阴影
    CPU_chart->setDropShadowEnabled(true);
    //把饼图到QChart上
    CPU_chart->addSeries(CPU_series);
    //设置标题画笔
    CPU_chart->setTitleBrush(QBrush(QColor(0, 0, 255)));
    //设置标题字体
    CPU_chart->setTitleFont(QFont("微软雅黑"));
    //设置标题
    CPU_chart->setTitle("CPU使用情况");
    //隐藏说明
    CPU_chart->legend()->hide();
    //把CPU_chart添加到视图中
    ui->charCPU_view->setChart(CPU_chart);
    //设置QPainter::Antialiasing 绘图抗锯齿
    ui->charCPU_view->setRenderHint(QPainter::Antialiasing);

}

//Mem饼图创建
void Pie::Mem_pie_chart()
{
    //分配新对象
    Mem_chart = new QChart();
    Mem_series = new QPieSeries(Mem_chart);
    //启动OpenGL加速
    Mem_series->setUseOpenGL(true);
    //设置控件外边界全部为0
    Mem_chart->layout()->setContentsMargins(0, 0, 1, 0);
    //设置内边界全部为0
    Mem_chart->setMargins(QMargins(0, 0, 0, 0));
    //设置背景区域无圆角
    Mem_chart->setBackgroundRoundness(0);
    //设置白色主题
    Mem_chart->setTheme(QChart::ChartThemeLight);
    //设置背景阴影
    Mem_chart->setDropShadowEnabled(true);
    //把饼图到QChart上
    Mem_chart->addSeries(Mem_series);
    //设置标题画笔
    Mem_chart->setTitleBrush(QBrush(QColor(0, 0, 255)));
    //设置标题字体
    Mem_chart->setTitleFont(QFont("微软雅黑"));
    //设置标题
    Mem_chart->setTitle("Mem使用情况");
    //隐藏说明
    Mem_chart->legend()->hide();
    //把Mem_chart添加到视图中
    ui->charMem_view->setChart(Mem_chart);
    //设置QPainter::Antialiasing 绘图抗锯齿
    ui->charMem_view->setRenderHint(QPainter::Antialiasing);

}

//Swap饼图创建
void Pie::Swap_pie_chart()
{
    //分配新对象
    Swap_chart = new QChart();
    Swap_series = new QPieSeries(Swap_chart);
    //启动OpenGL加速
    Swap_series->setUseOpenGL(true);
    //设置控件外边界全部为0
    Swap_chart->layout()->setContentsMargins(0, 0, 1, 0);
    //设置内边界全部为0
    Swap_chart->setMargins(QMargins(0, 0, 0, 0));
    //设置背景区域无圆角
    Swap_chart->setBackgroundRoundness(0);
    //设置白色主题
    Swap_chart->setTheme(QChart::ChartThemeLight);
    //设置背景阴影
    Swap_chart->setDropShadowEnabled(true);
    //把饼图到QChart上
    Swap_chart->addSeries(Swap_series);//添加数据
    //设置标题画笔
    Swap_chart->setTitleBrush(QBrush(QColor(0, 0, 255)));
    //设置标题字体
    Swap_chart->setTitleFont(QFont("微软雅黑"));
    //设置标题
    Swap_chart->setTitle("Swap使用情况");
    //隐藏说明
    Swap_chart->legend()->hide();
    //把Swap_chart添加到视图中
    ui->charSwap_view->setChart(Swap_chart);
    //设置QPainter::Antialiasing 绘图抗锯齿
    ui->charSwap_view->setRenderHint(QPainter::Antialiasing);
}

//Line折线图创建
void Pie::Line_chart(){
    //创建折线对象
    Net_chart = new QChart();
    Net_serial_rx = new QLineSeries();
    Net_serial_tx = new QLineSeries();
    //创建 x y 坐标轴
    QValueAxis* axisX = new QValueAxis;
    QValueAxis* axisY = new QValueAxis;
    //X轴标签
    axisX->setTitleText("时间(S)");
    //X  Y轴格子数
    axisX->setTickCount(10);
    axisY->setTickCount(8);
    //将轴添加到图表中,并且需要对齐
    Net_chart->addAxis(axisX,Qt::AlignBottom);
    Net_chart->addAxis(axisY,Qt::AlignLeft);
    //将数据添加到图表中
    Net_chart->addSeries(Net_serial_rx);
    Net_chart->addSeries(Net_serial_tx);
    //数据必须与坐标轴对齐
    Net_serial_rx->attachAxis(axisX);
    Net_serial_rx->attachAxis(axisY);
    Net_serial_tx->attachAxis(axisX);
    Net_serial_tx->attachAxis(axisY);
    //设置x轴的范围
    Net_chart->axisX()->setRange(0,60);
    Net_chart->axisY()->setRange(0,20);
    //将折线图放在line_view视图当中
    ui->line_view->setChart(Net_chart);
}

//设置Line折线图数据
void Pie::set_Net(int x1,float y1,int x2,float y2){
    //在存储数据中0处插入点数据
    Net_data_rx.insert(0,QPointF(x1,y1));
    Net_data_tx.insert(0,QPointF(x2,y2));
    //让每个点的x坐标加1;
    for(int i=1;i<Net_data_rx.count();i++){
        Net_data_rx[i].setX(Net_data_rx[i].x()+1);
    }
    for(int i=1;i<Net_data_tx.count();i++){
        Net_data_tx[i].setX(Net_data_tx[i].x()+1);
    }
    Net_serial_rx->replace(Net_data_rx);
    Net_serial_tx->replace(Net_data_tx);
}

//设置cpu饼图数据
void Pie::set_CPU(float id)
{
    //清除数据
    CPU_series->clear();
    //添加饼图标签和百分值
    CPU_series->append(QString("使用:%1 %").arg(100-id),100-id);
    CPU_series->append(QString("空闲:%1 %").arg(id), id);
    //设置第0快饼颜色
    CPU_series->slices().at(0)->setColor(QColor(13, 128, 217));
    CPU_series->slices().at(0)->setLabelColor(QColor(13, 128, 217));
    //设置第1快饼颜色
    CPU_series->slices().at(1)->setColor(QColor(69, 13, 217));
    CPU_series->slices().at(1)->setLabelColor(QColor(69, 13, 217));
    //设置label显示
    ui->CpuUse->setText(QString(" CPU使用:%1 %").arg(100-id));
    ui->CpuIdle->setText(QString("CPU空闲:%1 %").arg(id));
}

//设置Mem饼图数据
void Pie::set_Mem(int Memid,int Memuse)
{
    //清除数据
    Mem_series->clear();
    //添加饼图标签和百分值
    Mem_series->append(QString("空闲:%1 M").arg(Memid),Memid);
    Mem_series->append(QString("使用:%1 M").arg(Memuse),Memuse);
    //设置第0快饼颜色
    Mem_series->slices().at(0)->setColor(QColor(13, 128, 217));
    Mem_series->slices().at(0)->setLabelColor(QColor(13, 128, 217));
    //设置第1快饼颜色
    Mem_series->slices().at(1)->setColor(QColor(69, 13, 217));
    Mem_series->slices().at(1)->setLabelColor(QColor(69, 13, 217));
    //设置label显示
   ui->MemUse->setText(QString("Mem使用:%1 M").arg(Memuse));
   ui->MemIdle->setText(QString("Mem空闲:%1 M").arg(Memid));
}

//设置Swap饼图数据
void Pie::set_Swap(int Swapid,int Swapuse)
{
    //清除数据
    Swap_series->clear();
    //添加饼图标签和百分值
    Swap_series->append(QString("使用:%1 M").arg(Swapuse),Swapuse);
    Swap_series->append(QString("空闲:%1 M").arg(Swapid), Swapid);
    //设置第0快饼颜色
    Swap_series->slices().at(0)->setColor(QColor(13, 128, 217));
    Swap_series->slices().at(0)->setLabelColor(QColor(13, 128, 217));
    //设置第1快饼颜色
    Swap_series->slices().at(1)->setColor(QColor(69, 13, 217));
    Swap_series->slices().at(1)->setLabelColor(QColor(69, 13, 217));
    //设置label显示
   ui->SwapUse->setText(QString("Swap使用:%1 M").arg(Swapuse));
   ui->SwapIdle->setText(QString("Swap剩余:%1 M").arg(Swapid));
}

//定时处理和查询资源状态
void Pie::Msg_timer_Fun()//获取和分析数据
{
    //把获取到的数据转换为QString
    QString str(msg);//强制转换字符串
    //换行符分割
    QStringList msgList = str.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);//split只能分割字符串
    //空格符分割
    QStringList CpuList = msgList[2].split(QRegExp("\\s+") , QString::SkipEmptyParts);
    //设置CPU数据
    set_CPU(CpuList[7].toFloat());
    //空格符分割
    QStringList MemList = msgList[3].split(QRegExp("\\s+") , QString::SkipEmptyParts);
    //设置Mem数据
    set_Mem(MemList[5].toFloat(),MemList[7].toFloat());
    //空格符分割
    QStringList SwapList = msgList[4].split(QRegExp("\\s+") , QString::SkipEmptyParts);
    //设置Swap数据
    set_Swap(SwapList[4].toFloat(),SwapList[6].toFloat());
    //开启新一次资源查询
    msg.clear();
    process->kill();
    process->start("top -b -n 1");
}



//读取数据
void Pie::readRead()
{
    msg += process->readAll();//readAll从设备读取所有剩余数据,并将其作为字节数组返回
}





//跳转页面
void Pie::pushButton01(){
    ui->stackedWidget->setCurrentIndex(0);
}

void Pie::pushButton02(){
    ui->stackedWidget->setCurrentIndex(1);
}

void Pie::pushButton03(){
    ui->stackedWidget->setCurrentIndex(2);
}

Pie::~Pie()
{
    delete ui;


}

 四、ui

加入四个Graphics View,分别命名为charCPU_view、charMem_view、charSwap_view、line_view。三个饼图都各加两个Label分别命名为CpuIdle、CpuUse、MemIdle、MemUse、SwapIdle、SwapUse。

 

最重要的要把三个饼图和折线图进行提升,自己手动提升

 

 



总结

最终的运行如下

 代码还提供了按钮翻页功能,由于翻页后的内容内有进行编写就不过多提及

重要的事情说三遍

仅供本人参考、备忘!!!

仅供本人参考、备忘!!!

仅供本人参考、备忘!!!

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值