当前位置:   article > 正文

QT项目:linux资源监视器_qt 系统资源监视器

qt 系统资源监视器



前言

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

本篇文章仅供本人备忘用


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


一、首先是pro文件

需要在pro文件中加入charts

  1. QT += core gui charts
  2. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
  3. CONFIG += c++11
  4. # The following define makes your compiler emit warnings if you use
  5. # any Qt feature that has been marked deprecated (the exact warnings
  6. # depend on your compiler). Please consult the documentation of the
  7. # deprecated API in order to know how to port your code away from it.
  8. DEFINES += QT_DEPRECATED_WARNINGS
  9. # You can also make your code fail to compile if it uses deprecated APIs.
  10. # In order to do so, uncomment the following line.
  11. # You can also select to disable deprecated APIs only up to a certain version of Qt.
  12. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
  13. SOURCES += \
  14. main.cpp \
  15. pie.cpp
  16. HEADERS += \
  17. pie.h
  18. FORMS += \
  19. pie.ui
  20. # Default rules for deployment.
  21. qnx: target.path = /tmp/$${TARGET}/bin
  22. else: unix:!android: target.path = /opt/$${TARGET}/bin
  23. !isEmpty(target.path): INSTALLS += target


二、头文件(.h)

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

  1. #ifndef PIE_H
  2. #define PIE_H
  3. #include <QMainWindow>
  4. #include <QtCharts>
  5. #include <QLineSeries>
  6. #include <QValueAxis>
  7. #include <QPushButton>
  8. QT_BEGIN_NAMESPACE
  9. namespace Ui { class Pie; }
  10. QT_END_NAMESPACE
  11. class Pie : public QMainWindow
  12. {
  13. Q_OBJECT
  14. public:
  15. Pie(QWidget *parent = nullptr);
  16. ~Pie();
  17. void CPU_Pie_chart();
  18. void Mem_pie_chart();
  19. void Swap_pie_chart();
  20. void Line_chart();
  21. void set_CPU(float id); //设置cpu饼图数据
  22. void set_Mem(int Memid,int Memuse);//设置Mem饼图数据
  23. void set_Swap(int Swapid,int Swapuse);//设置Swap饼图数据
  24. void Process_init(); //饼图进程初始化
  25. void Process_init_Net();//折线图进程初始化
  26. //翻页按钮
  27. void pushButton01();
  28. void pushButton02();
  29. void pushButton03();
  30. void set_Net(int X1,float y1,int x2,float y2);//设置折线图数据
  31. public slots:
  32. void readRead();
  33. void Msg_timer_Fun();
  34. void Msg_timer_Fun_Net();
  35. private:
  36. Ui::Pie *ui;
  37. QProcess *process;//饼图进程
  38. QProcess *processNet;//折线图进程
  39. QPieSeries *CPU_series ; //Cpu饼图数据
  40. QByteArray msg;//char型字符 饼图信息
  41. QByteArray msgNet;//char字符 折线图信息
  42. QChart * CPU_chart ; //CPU饼图
  43. QTimer Msg_timer; //定时器
  44. //Mem
  45. QPieSeries *Mem_series;//Men饼图数据
  46. QChart *Mem_chart ;//Mem饼图
  47. //Swap
  48. QPieSeries *Swap_series;//Swap饼图数据
  49. QChart *Swap_chart ;//Swap饼图
  50. //折线图
  51. QChart *Net_chart;//折线图
  52. QLineSeries *Net_serial_rx;
  53. QLineSeries *Net_serial_tx;
  54. QValueAxis *axisX;
  55. QValueAxis *axisY;
  56. uint rx_bytes;
  57. uint tx_bytes;
  58. uint last_rx_bytes;
  59. uint last_tx_bytes;
  60. uint rx_rate;
  61. uint tx_rate;
  62. float rx;
  63. float tx;
  64. //QVector是QT中容器中的一种 对象存储在连续的内存中,可以使用索引号访问
  65. //QPointF类使用浮点数定义平面中的点 QPoint就是整数
  66. QVector<QPointF> Net_data_rx;
  67. QVector<QPointF> Net_data_tx;
  68. };
  69. #endif // PIE_H

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

  1. #include "pie.h"
  2. #include "ui_pie.h"
  3. Pie::Pie(QWidget *parent)
  4. : QMainWindow(parent)
  5. , ui(new Ui::Pie)
  6. {
  7. ui->setupUi(this);
  8. //设置开始页面为第一页
  9. ui->stackedWidget->setCurrentIndex(0);
  10. //创建CPU饼图
  11. CPU_Pie_chart();
  12. //创建Mcm饼图
  13. Mem_pie_chart();
  14. //创建Swap饼图
  15. Swap_pie_chart();
  16. //创建折线图
  17. Line_chart();
  18. //饼图进程初始化
  19. Process_init();
  20. //折线图进程初始化
  21. Process_init_Net();
  22. connect(ui->btn1, &QPushButton::clicked,this, &Pie::pushButton01);
  23. connect(ui->btn2, &QPushButton::clicked,this, &Pie::pushButton02);
  24. connect(ui->btn3, &QPushButton::clicked,this, &Pie::pushButton03);
  25. }
  26. //饼图进程初始化
  27. void Pie::Process_init()
  28. {
  29. //新建饼图进程
  30. process = new QProcess();
  31. //数据接收槽函数连接
  32. connect(process, SIGNAL(readyRead()), this, SLOT(readRead()));
  33. //禁止当前进程,使其立即退出
  34. process->kill();
  35. //开始进行查询指令
  36. process->start("top -b -n 1");
  37. //资源、进程定时查询
  38. Msg_timer.setInterval(1000);//1000ms触发一次每一秒
  39. //连接定时器定时触发信号和槽函数
  40. connect(&Msg_timer,SIGNAL(timeout()),this,SLOT(Msg_timer_Fun()));
  41. //启动定时器
  42. Msg_timer.start();
  43. }
  44. //折线图进程初始化
  45. void Pie::Process_init_Net(){
  46. //新建折线图进程
  47. processNet = new QProcess;
  48. //杀掉进程
  49. processNet->kill();//杀掉进程
  50. //开始查询
  51. processNet->start("cat /proc/net/dev");
  52. QByteArray msg = processNet->readAll();
  53. QString str(msg);
  54. //换行符分割
  55. QStringList msgList = str.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);
  56. for(int i=2;i<msgList.count();i++){
  57. QStringList netList = msgList[i].split(QRegExp("[\\s+]"),QString::SkipEmptyParts);
  58. if(netList[1]=="lo:"){
  59. continue;
  60. }
  61. rx_bytes = netList[1].toUInt();//接收
  62. tx_bytes = netList[9].toUInt();//发送
  63. qDebug()<<rx_bytes<<tx_bytes;
  64. }
  65. //定时器
  66. Msg_timer.setInterval(1000);
  67. connect(&Msg_timer,SIGNAL(timeout()),this,SLOT(Msg_timer_Fun_Net()));
  68. Msg_timer.start();
  69. }
  70. //折线图的定时处理和查询资源状态
  71. void Pie::Msg_timer_Fun_Net(){
  72. processNet->kill();//杀掉进程
  73. processNet->start("cat /proc/net/dev");
  74. //等待获取信息完成
  75. processNet->waitForFinished();
  76. QByteArray msgNet = processNet->readAll();
  77. //记录上一次的点
  78. last_rx_bytes = rx_bytes;
  79. last_tx_bytes = tx_bytes;
  80. QString str(msgNet);
  81. QStringList msgList = str.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);
  82. for(int i=3;i<msgList.count();i++){
  83. QStringList netList = msgList[i].split(QRegExp("[\\s+]"),QString::SkipEmptyParts);
  84. if(netList[0]=="lo:"){
  85. continue;
  86. }
  87. rx_bytes = netList[1].toUInt();//接收
  88. tx_bytes = netList[9].toUInt();//发送
  89. }
  90. uint rx_rate = rx_bytes - last_rx_bytes;
  91. uint tx_rate = tx_bytes - last_tx_bytes;
  92. set_Net(0,(float)rx_rate/1024.0,0,(float)tx_rate/1024.0);
  93. }
  94. //CPU饼图创建
  95. void Pie::CPU_Pie_chart()
  96. {
  97. //分配新对象
  98. CPU_chart = new QChart();
  99. CPU_series = new QPieSeries(CPU_chart);
  100. //启动OpenGL加速
  101. CPU_series->setUseOpenGL(true);
  102. //设置控件外边界全部为0
  103. CPU_chart->layout()->setContentsMargins(0, 0, 1, 0);
  104. //设置内边界全部为0
  105. CPU_chart->setMargins(QMargins(0, 0, 0, 0));
  106. //设置背景区域无圆角
  107. CPU_chart->setBackgroundRoundness(0);
  108. //设置白色主题
  109. CPU_chart->setTheme(QChart::ChartThemeLight);
  110. //设置背景阴影
  111. CPU_chart->setDropShadowEnabled(true);
  112. //把饼图到QChart上
  113. CPU_chart->addSeries(CPU_series);
  114. //设置标题画笔
  115. CPU_chart->setTitleBrush(QBrush(QColor(0, 0, 255)));
  116. //设置标题字体
  117. CPU_chart->setTitleFont(QFont("微软雅黑"));
  118. //设置标题
  119. CPU_chart->setTitle("CPU使用情况");
  120. //隐藏说明
  121. CPU_chart->legend()->hide();
  122. //把CPU_chart添加到视图中
  123. ui->charCPU_view->setChart(CPU_chart);
  124. //设置QPainter::Antialiasing 绘图抗锯齿
  125. ui->charCPU_view->setRenderHint(QPainter::Antialiasing);
  126. }
  127. //Mem饼图创建
  128. void Pie::Mem_pie_chart()
  129. {
  130. //分配新对象
  131. Mem_chart = new QChart();
  132. Mem_series = new QPieSeries(Mem_chart);
  133. //启动OpenGL加速
  134. Mem_series->setUseOpenGL(true);
  135. //设置控件外边界全部为0
  136. Mem_chart->layout()->setContentsMargins(0, 0, 1, 0);
  137. //设置内边界全部为0
  138. Mem_chart->setMargins(QMargins(0, 0, 0, 0));
  139. //设置背景区域无圆角
  140. Mem_chart->setBackgroundRoundness(0);
  141. //设置白色主题
  142. Mem_chart->setTheme(QChart::ChartThemeLight);
  143. //设置背景阴影
  144. Mem_chart->setDropShadowEnabled(true);
  145. //把饼图到QChart上
  146. Mem_chart->addSeries(Mem_series);
  147. //设置标题画笔
  148. Mem_chart->setTitleBrush(QBrush(QColor(0, 0, 255)));
  149. //设置标题字体
  150. Mem_chart->setTitleFont(QFont("微软雅黑"));
  151. //设置标题
  152. Mem_chart->setTitle("Mem使用情况");
  153. //隐藏说明
  154. Mem_chart->legend()->hide();
  155. //把Mem_chart添加到视图中
  156. ui->charMem_view->setChart(Mem_chart);
  157. //设置QPainter::Antialiasing 绘图抗锯齿
  158. ui->charMem_view->setRenderHint(QPainter::Antialiasing);
  159. }
  160. //Swap饼图创建
  161. void Pie::Swap_pie_chart()
  162. {
  163. //分配新对象
  164. Swap_chart = new QChart();
  165. Swap_series = new QPieSeries(Swap_chart);
  166. //启动OpenGL加速
  167. Swap_series->setUseOpenGL(true);
  168. //设置控件外边界全部为0
  169. Swap_chart->layout()->setContentsMargins(0, 0, 1, 0);
  170. //设置内边界全部为0
  171. Swap_chart->setMargins(QMargins(0, 0, 0, 0));
  172. //设置背景区域无圆角
  173. Swap_chart->setBackgroundRoundness(0);
  174. //设置白色主题
  175. Swap_chart->setTheme(QChart::ChartThemeLight);
  176. //设置背景阴影
  177. Swap_chart->setDropShadowEnabled(true);
  178. //把饼图到QChart上
  179. Swap_chart->addSeries(Swap_series);//添加数据
  180. //设置标题画笔
  181. Swap_chart->setTitleBrush(QBrush(QColor(0, 0, 255)));
  182. //设置标题字体
  183. Swap_chart->setTitleFont(QFont("微软雅黑"));
  184. //设置标题
  185. Swap_chart->setTitle("Swap使用情况");
  186. //隐藏说明
  187. Swap_chart->legend()->hide();
  188. //把Swap_chart添加到视图中
  189. ui->charSwap_view->setChart(Swap_chart);
  190. //设置QPainter::Antialiasing 绘图抗锯齿
  191. ui->charSwap_view->setRenderHint(QPainter::Antialiasing);
  192. }
  193. //Line折线图创建
  194. void Pie::Line_chart(){
  195. //创建折线对象
  196. Net_chart = new QChart();
  197. Net_serial_rx = new QLineSeries();
  198. Net_serial_tx = new QLineSeries();
  199. //创建 x y 坐标轴
  200. QValueAxis* axisX = new QValueAxis;
  201. QValueAxis* axisY = new QValueAxis;
  202. //X轴标签
  203. axisX->setTitleText("时间(S)");
  204. //X Y轴格子数
  205. axisX->setTickCount(10);
  206. axisY->setTickCount(8);
  207. //将轴添加到图表中,并且需要对齐
  208. Net_chart->addAxis(axisX,Qt::AlignBottom);
  209. Net_chart->addAxis(axisY,Qt::AlignLeft);
  210. //将数据添加到图表中
  211. Net_chart->addSeries(Net_serial_rx);
  212. Net_chart->addSeries(Net_serial_tx);
  213. //数据必须与坐标轴对齐
  214. Net_serial_rx->attachAxis(axisX);
  215. Net_serial_rx->attachAxis(axisY);
  216. Net_serial_tx->attachAxis(axisX);
  217. Net_serial_tx->attachAxis(axisY);
  218. //设置x轴的范围
  219. Net_chart->axisX()->setRange(0,60);
  220. Net_chart->axisY()->setRange(0,20);
  221. //将折线图放在line_view视图当中
  222. ui->line_view->setChart(Net_chart);
  223. }
  224. //设置Line折线图数据
  225. void Pie::set_Net(int x1,float y1,int x2,float y2){
  226. //在存储数据中0处插入点数据
  227. Net_data_rx.insert(0,QPointF(x1,y1));
  228. Net_data_tx.insert(0,QPointF(x2,y2));
  229. //让每个点的x坐标加1
  230. for(int i=1;i<Net_data_rx.count();i++){
  231. Net_data_rx[i].setX(Net_data_rx[i].x()+1);
  232. }
  233. for(int i=1;i<Net_data_tx.count();i++){
  234. Net_data_tx[i].setX(Net_data_tx[i].x()+1);
  235. }
  236. Net_serial_rx->replace(Net_data_rx);
  237. Net_serial_tx->replace(Net_data_tx);
  238. }
  239. //设置cpu饼图数据
  240. void Pie::set_CPU(float id)
  241. {
  242. //清除数据
  243. CPU_series->clear();
  244. //添加饼图标签和百分值
  245. CPU_series->append(QString("使用:%1 %").arg(100-id),100-id);
  246. CPU_series->append(QString("空闲:%1 %").arg(id), id);
  247. //设置第0快饼颜色
  248. CPU_series->slices().at(0)->setColor(QColor(13, 128, 217));
  249. CPU_series->slices().at(0)->setLabelColor(QColor(13, 128, 217));
  250. //设置第1快饼颜色
  251. CPU_series->slices().at(1)->setColor(QColor(69, 13, 217));
  252. CPU_series->slices().at(1)->setLabelColor(QColor(69, 13, 217));
  253. //设置label显示
  254. ui->CpuUse->setText(QString(" CPU使用:%1 %").arg(100-id));
  255. ui->CpuIdle->setText(QString("CPU空闲:%1 %").arg(id));
  256. }
  257. //设置Mem饼图数据
  258. void Pie::set_Mem(int Memid,int Memuse)
  259. {
  260. //清除数据
  261. Mem_series->clear();
  262. //添加饼图标签和百分值
  263. Mem_series->append(QString("空闲:%1 M").arg(Memid),Memid);
  264. Mem_series->append(QString("使用:%1 M").arg(Memuse),Memuse);
  265. //设置第0快饼颜色
  266. Mem_series->slices().at(0)->setColor(QColor(13, 128, 217));
  267. Mem_series->slices().at(0)->setLabelColor(QColor(13, 128, 217));
  268. //设置第1快饼颜色
  269. Mem_series->slices().at(1)->setColor(QColor(69, 13, 217));
  270. Mem_series->slices().at(1)->setLabelColor(QColor(69, 13, 217));
  271. //设置label显示
  272. ui->MemUse->setText(QString("Mem使用:%1 M").arg(Memuse));
  273. ui->MemIdle->setText(QString("Mem空闲:%1 M").arg(Memid));
  274. }
  275. //设置Swap饼图数据
  276. void Pie::set_Swap(int Swapid,int Swapuse)
  277. {
  278. //清除数据
  279. Swap_series->clear();
  280. //添加饼图标签和百分值
  281. Swap_series->append(QString("使用:%1 M").arg(Swapuse),Swapuse);
  282. Swap_series->append(QString("空闲:%1 M").arg(Swapid), Swapid);
  283. //设置第0快饼颜色
  284. Swap_series->slices().at(0)->setColor(QColor(13, 128, 217));
  285. Swap_series->slices().at(0)->setLabelColor(QColor(13, 128, 217));
  286. //设置第1快饼颜色
  287. Swap_series->slices().at(1)->setColor(QColor(69, 13, 217));
  288. Swap_series->slices().at(1)->setLabelColor(QColor(69, 13, 217));
  289. //设置label显示
  290. ui->SwapUse->setText(QString("Swap使用:%1 M").arg(Swapuse));
  291. ui->SwapIdle->setText(QString("Swap剩余:%1 M").arg(Swapid));
  292. }
  293. //定时处理和查询资源状态
  294. void Pie::Msg_timer_Fun()//获取和分析数据
  295. {
  296. //把获取到的数据转换为QString
  297. QString str(msg);//强制转换字符串
  298. //换行符分割
  299. QStringList msgList = str.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);//split只能分割字符串
  300. //空格符分割
  301. QStringList CpuList = msgList[2].split(QRegExp("\\s+") , QString::SkipEmptyParts);
  302. //设置CPU数据
  303. set_CPU(CpuList[7].toFloat());
  304. //空格符分割
  305. QStringList MemList = msgList[3].split(QRegExp("\\s+") , QString::SkipEmptyParts);
  306. //设置Mem数据
  307. set_Mem(MemList[5].toFloat(),MemList[7].toFloat());
  308. //空格符分割
  309. QStringList SwapList = msgList[4].split(QRegExp("\\s+") , QString::SkipEmptyParts);
  310. //设置Swap数据
  311. set_Swap(SwapList[4].toFloat(),SwapList[6].toFloat());
  312. //开启新一次资源查询
  313. msg.clear();
  314. process->kill();
  315. process->start("top -b -n 1");
  316. }
  317. //读取数据
  318. void Pie::readRead()
  319. {
  320. msg += process->readAll();//readAll从设备读取所有剩余数据,并将其作为字节数组返回
  321. }
  322. //跳转页面
  323. void Pie::pushButton01(){
  324. ui->stackedWidget->setCurrentIndex(0);
  325. }
  326. void Pie::pushButton02(){
  327. ui->stackedWidget->setCurrentIndex(1);
  328. }
  329. void Pie::pushButton03(){
  330. ui->stackedWidget->setCurrentIndex(2);
  331. }
  332. Pie::~Pie()
  333. {
  334. delete ui;
  335. }

 四、ui

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

 

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

 

 



总结

最终的运行如下

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

重要的事情说三遍

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

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

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

 

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号