QT 模拟任务管理器

    本文实现任务管理器的效果:

    cpu curve

 

   实现思路: 1. 不断减小x坐标值,使得网格线平移  2. 将cpu使用率放入一固定数组中, 遍历数组选取相邻两点画直线. 

   dialog.h 

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

class Dialog:public QDialog
{
    Q_OBJECT
public:
    Dialog(QWidget *parent=0);
    ~Dialog();

protected:
    void paintEvent(QPaintEvent *);

    void timerEvent(QTimerEvent *);

    float usage() const;

private:
    QPixmap pixmap;
    int base;
    int columnInc; // 动态列偏移值

    int *pts; // 随机数据数组
    int mLen; // 记录数组长度
    int ptNum; // 点数目
};

#endif

   

   dialog.cpp

#include "dialog.h"
#include <QtGui>

Dialog::Dialog(QWidget *parent):QDialog(parent)
{
    this->setWindowTitle(tr("内存监控"));
	this->resize(480,450);

    pts=NULL;

    base=10; // 边界基数为10
    columnInc=0;

    // 黑色背景图
    pixmap=QPixmap(width()-base*2,height()-base*2);
    pixmap.fill(Qt::black);

    // 定时器刷新线条
    startTimer(1000);
}

Dialog::~Dialog()
{
    if(pts)
        delete pts;
}

void Dialog::paintEvent(QPaintEvent *e)
{
    QPainter painter(this);

	// 线条色
	QPen pen(QColor(46, 139, 87),1.0);
	painter.setPen(pen);

    // 在图像上作画
    painter.drawPixmap(10,10,pixmap);

    int graphW=pixmap.width();
    int graphH=pixmap.height();

    // 画15行直线
    int graphRow=graphH/15;
    for(int i=base;i<=graphH+base;i+=graphRow)
	{
        painter.drawLine(base,i,base+graphW,i);
	}

    // 动态列指示参数
    int graphColumn=graphW/15;
    if(columnInc==0)
    {
        columnInc=graphColumn;
    }

    // 画15列直线
    for(int j=base+columnInc;j<graphW+base;j+=graphColumn)
	{
        painter.drawLine(j,base,j,base+graphH);
	}

    --columnInc; // 改变x坐标值,使曲线产生运动效果

    if(pts==NULL)
    {
        pts=new int[graphW];
        mLen=graphW;
        ptNum=0;
    }else
    {
        painter.setPen(QPen(Qt::yellow,1.0));

        // 产生随机数模拟CPU使用情况
        pts[ptNum]=base+graphH*usage();

        // 遍历数组,从后面开始画曲线
        for(int j=base+graphW-ptNum,k=0;k<ptNum;k++,j++)
        {
            if(k!=0)
            {
                if(pts[k]!=pts[k-1])
                {
                    painter.drawLine(j-1,pts[k-1],j,pts[k]); // 画直线
                }else
                {
                    painter.fillRect(j,pts[k],1,1,Qt::SolidPattern); // 相等则画矩形
                }
            }
        }

        if(ptNum+2==mLen) // 曲线到达最左端
        {
            for(int i=1;i<ptNum;i++)
            {
                pts[i-1]=pts[i];  // 舍弃最前面2点,从后向前赋值
            }
            --ptNum;
        }else // 曲线在中间
        {
            ptNum++;
        }
    }
}


void Dialog::timerEvent(QTimerEvent *e)
{
    // 定时刷新界面
    update();
}

float Dialog::usage() const
{
    // 用当前时间设置种子
    QTime time=QTime::currentTime();
    qint64 msecs=time.second()*1000+time.msec();
    qsrand(msecs);

    // 取(0-1)间小数值
    float usage=0.0;
    while(true)
    {
        usage=(qrand()%100)/100.0;
        if(usage>0.1&&usage<0.9)
            break;
    }

    return usage;
}

 

你可能感兴趣的:(QT任务管理器)