zoukankan      html  css  js  c++  java
  • QT实现Linux下系统监控小工具

           由于过段时间得帮师兄做一个linux下的图形化测试程序,所以最近开始学习Qt,感觉Qt用起来挺方便简单的,上手还算比较快吧,近两天就写了一个用来监控系统的小工具,功能尚不完善,还在探索,觉得也有必要记录下工作同时还得弄清楚类似任务管理器的东东是怎么得到系统数据和性能的~~

      闲话少说,Qt的安装过程就十分费劲,前段时间由于官网服务器(http://Qt-project.org/downloads)自己的问题,每次下到一半多就自动断了,都快崩溃了......要使用Qt必须有Qtlibray和QtCreator,最新的版本是5.0,需要有较高版本的GLIBC和GLIBCXX的支持,具体多少版本可以我忘了......反正比较新的就行了,不然安装不能成功。i

      Qt使用的对象与方法通信的机制称为信号和槽机制,这也是Qt特点之一。由于我以前接触过MFC,所以个人感觉和window编程中的消息与消息处理函数很类似,不知到谁前谁后。

      具体讲,Qt的基类QObject中有一个成员函数来完成信号和槽的关联。函数原型如下:

    #include <QObject>
    
    static bool QObject::connect(const QObject *sender,const char *signal,const Qbject *receiver,const char *member);

      其中sender为发送信号的控件,receiver为接受信号的控件,member为槽函数。

      本着学习的态度,开始做一个系统监控工具,其中使用到了QTableWidget,QTabWidget,Graphics View,Push Button,MenuBar等控件,基本界面如下:

               

       由于不了解任务管理器的原理,我就想linux下一般都能在/proc/目录下查看cpuinfo,meminfo等文件来查看系统信息,是不是可以读取这些文件内容,然后将单击Button与显示内容进行关联,似乎是可行的。以内存子Tab为例,单击Mem-start按钮,得到实时的内存,交换区,缓冲等信息,每次点击Mem-start后信息会刷新,但暂时还不能自动动态刷新,估计得搞个定时器神马的才行,算是下一步计划吧。

              

      cat  /proc/meminfo,发现文件格式很规整,所以我想每次从文件中读一个字符串,要得到MemTotal信息,就先检测,若读到MemTotal:,则再向后读一个字符串,然后将结果保存给特定的类,之后传递给DisplayMemInfo函数,显示之(读取文件并判断的代码太丑,楼主就不好意思贴出来了~)。

    class MemInfo{
    public:
        string MemTotal;
        string MemFree;
        string Buffers;
        string Cached;
        string SwapTotal;
        string SwapFree;
    };

      上面数据结构用于保存读到的memory相关信息。

    void MainWindow::DisplayMemInfo()
    {
        TestMemInfo();
        ui->tableWidget_2->setItem(0,0,new QTableWidgetItem(mem_infoKB.MemTotal.c_str()));
        ui->tableWidget_2->setItem(0,1,new QTableWidgetItem(mem_infoKB.MemFree.c_str()));
        ui->tableWidget_2->setItem(0,2,new QTableWidgetItem(mem_infoKB.Buffers.c_str()));
        ui->tableWidget_2->setItem(0,3,new QTableWidgetItem(mem_infoKB.Cached.c_str()));
        ui->tableWidget_2->setItem(0,4,new QTableWidgetItem(mem_infoKB.SwapTotal.c_str()));
        ui->tableWidget_2->setItem(0,5,new QTableWidgetItem(mem_infoKB.SwapFree.c_str()));
    
        ui->tableWidget_2->setItem(1,0,new QTableWidgetItem(mem_infoMB.MemTotal.c_str()));
        ui->tableWidget_2->setItem(1,1,new QTableWidgetItem(mem_infoMB.MemFree.c_str()));
        ui->tableWidget_2->setItem(1,2,new QTableWidgetItem(mem_infoMB.Buffers.c_str()));
        ui->tableWidget_2->setItem(1,3,new QTableWidgetItem(mem_infoMB.Cached.c_str()));
        ui->tableWidget_2->setItem(1,4,new QTableWidgetItem(mem_infoMB.SwapTotal.c_str()));
        ui->tableWidget_2->setItem(1,5,new QTableWidgetItem(mem_infoMB.SwapFree.c_str()));
    }  

         最后是菜单上的关于信息窗口,相信每个图形化项目都有一个关于信息框用于显示制作公司或人员信息以及版本号,图标之类的信息,看起来还凑合~ ,计划下一步是将得到的数据弄成图形形式的,这样更直观,也符合可视化这种需求:-)

           

  • 相关阅读:
    阿里云SSL证书到期(续期)图文教程
    nginx: [error] open() "/var/run/nginx.pid" failed (2: No such file or directory)
    Mysql读写分离,主从同步实现
    MySQL Waiting for table metadata lock的解决方法
    MYSQL 版本5.7.24 sql_mode=only_full_group_by问题
    CentOS7下PHP7.2安装redis扩展
    每天写点python
    vim 编辑器的光标操作
    【linux使用】bash shell命令行常用快捷键 (转载)
    centos7 cannot find a valid baseurl for repo base (转载)
  • 原文地址:https://www.cnblogs.com/XiaoHDeBlog/p/3013198.html
Copyright © 2011-2022 走看看