不知是哪个版本的迅雷,有个“下载速度柱状图”的小界面,我比较喜欢(只不过最新版本的迅雷却没了),所以决定来山寨一个。当然,这个山寨品不能下载文件,呵呵。
思路:
1:将界面的背景涂成黑色
2:每隔0.1秒就产生一个随机数,将它们添加到一个容器中
3:重载paintEvent函数,,从界面的右边开始,依次将容器中的元素按倒序画出来(每个数据就是一个柱形)
代码:
main.cpp
1 2 3 4 5 6 7 8 9 10 11 |
#include "barchart.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); BarChart w; w.show(); return a.exec(); } |
barchart.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#ifndef BARCHART_H #define BARCHART_H #include <QWidget> #include <QTimer> class BarChart : public QWidget { Q_OBJECT private: QList<int> m_List; //储存历史上所记录的那些点 QSize m_Size; //当前绘图窗口的大小 QTimer m_Timer; //定时器,每0.1秒发出一次信号,模拟收到数据 protected: void paintEvent(QPaintEvent *event); void resizeEvent(QResizeEvent *event); public: BarChart(QWidget *parent = 0); ~BarChart() { } public slots: void AddDataSlot(); }; #endif // BARCHART_H |
barchart.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
#include "barchart.h" #include <QResizeEvent> #include <QDateTime> #include <QPainter> BarChart::BarChart(QWidget *parent) : QWidget(parent) { //定义定时器 qsrand( QDateTime::currentDateTime().toMSecsSinceEpoch() ); connect(&m_Timer, SIGNAL(timeout()), this, SLOT(AddDataSlot())); m_Timer.start(100); } void BarChart::paintEvent(QPaintEvent *event) { const int WIDTH = 2; QPainter painter(this); //设置背景为黑色 painter.setBrush(Qt::black); painter.drawRect(-2, -2, m_Size.width()+4, m_Size.height()+4); painter.setPen( QPen(Qt::green, WIDTH) ); int tx, cx, cy1, cy2; tx = 0; cy1 = m_Size.height(); //画出各段竖线 QList<int>::iterator iter = m_List.end(); while( iter != m_List.begin() ) { cy2 = cy1 - (*(--iter)*m_Size.height()/1000); cx = m_Size.width() - tx; painter.drawLine(cx, cy1, cx, cy2); tx += WIDTH; } } void BarChart::resizeEvent(QResizeEvent *event) { m_Size = event->size(); update(); } void BarChart::AddDataSlot() { //添加一个0-999的数据 int temp = qrand() % 1000; m_List.push_back(temp); //如果数据太长了,就丢掉前面的那一部分 if( m_List.size() > m_Size.width() ) m_List.pop_front(); update(); } |
发表评论
要发表评论,您必须先登录。