利用Qt繪制雷達(dá)掃描效果
話不多說(shuō)直接上代碼,代碼規(guī)范性可能差了點(diǎn),但是效果得以實(shí)現(xiàn),在這里記錄一下。
scan.h的代碼如下
#ifndef SCAN_H #define SCAN_H #include <QWidget> #include <QPainter> #include <QTime> #include <QTimer> #include <QDebug> #include <QPoint> #include <QtMath> namespace Ui { class Scan; } class Scan : public QWidget { Q_OBJECT public: explicit Scan(QWidget *parent = nullptr); ~Scan(); public slots: void timerTimeOut(); protected: void paintEvent(QPaintEvent *event) override; private slots: void on_pushButton_clicked(); private: Ui::Scan *ui; }; #endif // SCAN_H
scan.cpp的代碼如下
#include "scan.h" #include "ui_scan.h" QTimer *timer = new QTimer(); int m_angle=0; int alpha=0; double cir_size=5; Scan::Scan(QWidget *parent) : QWidget(parent), ui(new Ui::Scan) { ui->setupUi(this); setPalette(Qt::black); setAutoFillBackground(true);//強(qiáng)制設(shè)置背景顏色為黑色 connect(timer,SIGNAL(timeout()),this,SLOT(timerTimeOut()));//用槽函數(shù)控制雷達(dá)掃描效果。 timer->start(10); } Scan::~Scan() { delete ui; } void Scan::timerTimeOut() { timer->start(10); if(m_angle<-360){ m_angle=0; }//實(shí)現(xiàn)無(wú)縫連接,且保證m_angle的值不會(huì)溢出 if(alpha>=255){ alpha = 0; } if(cir_size>10){ cir_size=5; } update(); } void Scan::paintEvent(QPaintEvent *event)//此函數(shù)自動(dòng)執(zhí)行,實(shí)現(xiàn)掃描動(dòng)畫(huà)效果 { Q_UNUSED(event); QPainter painter(this); QPen pen; painter.setRenderHint(QPainter::Antialiasing); painter.setPen(QPen(qRgba(128, 255, 0,250))); //網(wǎng)格改成坐標(biāo)系 int x=280;//原本為240,右移40,下移60 int y=300; /** 直徑按照480處理 每隔40px畫(huà)一個(gè)圓 繪制雷達(dá)圖**/ QPoint center(x,y); painter.drawEllipse(center,240,240); painter.drawEllipse(center,240-48,240-48); painter.drawEllipse(center,240-96,240-96); painter.drawEllipse(center,240-144,240-144); painter.drawEllipse(center,240-192,240-192); /** 畫(huà)外圈刻度值,將坐標(biāo)系移動(dòng)到圓心 **/ painter.translate(x,y); painter.setPen(QPen(qRgba(255, 255, 0,250))); painter.setFont(QFont("Calibri",10)); for(int i=1;i<=360;i++){ painter.rotate(1); painter.drawLine(0,-240,0,-235); } for(int i=1;i<=72;i++){ painter.rotate(5); painter.drawLine(0,-240,0,-232); } for(int i=1;i<=36;i++){ painter.setRenderHint(QPainter::Antialiasing); painter.rotate(10); painter.drawLine(0,-240,0,-228); } for(int i=1;i<=4;i++){ painter.rotate(90); painter.drawLine(0,-240,0,-168); } painter.translate(-x,-y);//恢復(fù)坐標(biāo)系 /** 繪制掃描效果 **/ QConicalGradient gradient(x, y, m_angle + 360); gradient.setColorAt(0.1, QColor(128, 255, 0, 150)); gradient.setColorAt(0.7, QColor(0, 255, 0, 0));//尾部 painter.setBrush(gradient); painter.setPen(QPen(Qt::NoPen));//去掉外框線 if (width() > height()){ painter.drawPie(40, 60, 480, 480, m_angle * 16, 360 * 16); } else{ painter.drawPie(40, 60, 480, 480, m_angle * 16, 360 * 16);} m_angle -= 1;//每次旋轉(zhuǎn)1度 alpha +=2; cir_size+=0.01; //模擬畫(huà)出可疑點(diǎn) painter.setBrush(QBrush(QColor(50, 255, 200,alpha))); painter.drawEllipse(0,0,15,15); painter.drawEllipse(60+120,60+161,cir_size,cir_size); painter.drawEllipse(60+240,60+161,cir_size,cir_size); painter.drawEllipse(60+300,60+300,cir_size,cir_size); painter.setBrush(QBrush(QColor(50, 255, 200,(alpha+50)%255))); painter.drawEllipse(60+160,60+121,cir_size,cir_size); painter.drawEllipse(60+60,60+191,cir_size,cir_size); painter.drawEllipse(60+260,60+221,cir_size,cir_size); painter.setBrush(QBrush(QColor(50, 255, 200,(alpha+100)%255))); painter.drawEllipse(60+210,60+181,cir_size,cir_size); painter.drawEllipse(60+10,60+281,cir_size,cir_size); painter.drawEllipse(60+100,60+81,cir_size,cir_size); } void Scan::on_pushButton_clicked() { m_angle=0;//將掃描動(dòng)畫(huà)重置并刷新數(shù)據(jù),后面要將數(shù)據(jù)刷新的函數(shù)寫(xiě)在下面。 }
效果圖,雷達(dá)右上角的圖標(biāo)對(duì)應(yīng)著on_pushButton的點(diǎn)擊事件
到此這篇關(guān)于利用Qt繪制雷達(dá)掃描效果的文章就介紹到這了,更多相關(guān)Qt雷達(dá)掃描內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++詳解如何通過(guò)模板實(shí)現(xiàn)元素的反序
這篇文章主要介紹了C++中模板(Template)實(shí)現(xiàn)元素的反序,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06基于C語(yǔ)言實(shí)現(xiàn)圖書(shū)管理信息系統(tǒng)設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)圖書(shū)管理信息系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01C語(yǔ)言實(shí)現(xiàn)C++繼承和多態(tài)的代碼分享
本文主要給大家簡(jiǎn)單講訴了C和C++的區(qū)別以及如何使用C語(yǔ)言模擬實(shí)現(xiàn)C++繼承和多態(tài),并附上示例代碼,是篇相當(dāng)不錯(cuò)的文章,推薦給喜歡C語(yǔ)言的小伙伴們2017-07-07實(shí)現(xiàn)posix消息隊(duì)列示例分享
這篇文章主要介紹了實(shí)現(xiàn)posix消息隊(duì)列示例,學(xué)習(xí)記錄鎖,線程互斥量,線程條件變量,內(nèi)存映射,信號(hào),線程的綜合應(yīng)用,需要的朋友可以參考下2014-02-02