Qt5_在QWidget中畫動態圖

在以前的文章中,我們介紹瞭如何在QTabWidget中畫網絡拓撲圖。今天,我們介紹一下,如何使得所畫的圖呈現出動態的變化,比如在網絡拓撲中,隨着時間的變化,一些節點顯示紅色,一些節點顯示綠色。
準備過程:紅色和綠色的圖片
思路:依舊使用重寫paintevent函數來實現畫圖功能,要使圖片隨着時間的變化更新,就需要使用計時器來觸發頁面更新,頁面更新可以使用update函數。
代碼:

#include "showtopology.h"
#include "mainwindow.h"
#include <QPainter>
#include <QWidget>
#include <QTime>
#include <QTimer>


showtopology::showtopology(QWidget *parent) : QWidget(parent)
{
    QTimer *timer3= new QTimer();//聲明計時器
    connect(timer3,SIGNAL(timeout()),this,SLOT(update()));//計時器用來觸發更新
    timer3->start(1000);//更新間隔爲1秒
}
void showtopology::paintEvent(QPaintEvent *event)
{
    QPainter paint(this);
    paint.setPen(Qt::DashLine);
    paint.setRenderHint(QPainter::Antialiasing, true);
    QPixmap ap1("ap1.png");//AP和兩種STA的圖片的聲明;
    QPixmap img1("STA2.png");
    QPixmap img2("STA1.png");
    paint.drawPixmap(350,150,ap1);

    qsrand(time(NULL));
    int n1;
    double n[50];//一共有50個節點
    for (int i =0; i<50; i++)
        {
        n1= qrand();
        n[i] = n1/10000000.0;
    }
    for(int i = 0; i<50; i++)
        {
        if (n[i]<30)//使某一個節點的隨機數小於30的顯示STA2的圖片
            {
            switch (i)
                    {
                case 0 :paint.drawPixmap(50,20,img1);
                    break;
                case 1: paint.drawPixmap(100,100,img1);
                    break;
                case 2:  paint.drawPixmap(350,200,img1);
                    break;
                case 3: paint.drawPixmap(500,200,img1);
                    break;
                case 4 :paint.drawPixmap(300,75,img1);
                    break;
                case 5 :paint.drawPixmap(503,120,img1);
                    break;
                case 6 :paint.drawPixmap(160,66,img1);
                    break;
                case 7 :paint.drawPixmap(200,190,img1);
                    break;
                case 8: paint.drawPixmap(360,190,img1);
                    break;
                case 9 :paint.drawPixmap(350,180,img1);
                    break;
                default : break;
            }
            paint.drawLine(350,150,50,20);
            paint.drawLine(350,150,100,100);
            paint.drawLine(350,150,350,200);
            paint.drawLine(350,150,500,200);
            paint.drawLine(350,150,300,75);
            paint.drawLine(350,150,503,120);
            paint.drawLine(350,150,160,66);
            paint.drawLine(350,150,200,190);
            paint.drawLine(350,150,360,190);
            paint.drawLine(350,150,350,180);
        }
        else//節點隨機數大於30的顯示STA1的圖片
        {
            switch (i)
                    {
                case 0 :paint.drawPixmap(50,20,img2);//畫STA
                    break;
                case 1: paint.drawPixmap(100,100,img2);
                    break;
                case 2:  paint.drawPixmap(350,200,img2);
                    break;
                case 3: paint.drawPixmap(500,200,img2);
                    break;
                case 4 :paint.drawPixmap(300,75,img2);
                    break;
                case 5 :paint.drawPixmap(503,120,img2);
                    break;
                case 6 :paint.drawPixmap(160,66,img2);
                    break;
                case 7 :paint.drawPixmap(200,190,img2);
                    break;
                case 8: paint.drawPixmap(360,190,img2);
                    break;
                case 9 :paint.drawPixmap(350,180,img2);
                    break;
                default : break;
            }
        paint.drawLine(350,150,50,20);//畫連接線
        paint.drawLine(350,150,100,100);
        paint.drawLine(350,150,350,200);
        paint.drawLine(350,150,500,200);
        paint.drawLine(350,150,300,75);
        paint.drawLine(350,150,503,120);
        paint.drawLine(350,150,160,66);
        paint.drawLine(350,150,200,190);
        paint.drawLine(350,150,360,190);
        paint.drawLine(350,150,350,180);
        }
    }
}

最終的效果如下圖所示:
效果顯示圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章