QT 模拟任务管理器
本文实现任务管理器的效果:
实现思路: 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;
}