利用Qt繪制雷達(dá)掃描效果
更新時間:2023年04月04日 09:28:56 作者:Keep apart
這篇文章主要為大家詳細(xì)介紹了如何利用Qt繪制簡單的雷達(dá)掃描效果,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,需要的可以參考一下
話不多說直接上代碼,代碼規(guī)范性可能差了點,但是效果得以實現(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_Hscan.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;
}//實現(xiàn)無縫連接,且保證m_angle的值不會溢出
if(alpha>=255){
alpha = 0;
}
if(cir_size>10){
cir_size=5;
}
update();
}
void Scan::paintEvent(QPaintEvent *event)//此函數(shù)自動執(zhí)行,實現(xiàn)掃描動畫效果
{
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畫一個圓 繪制雷達(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);
/** 畫外圈刻度值,將坐標(biāo)系移動到圓心 **/
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;
//模擬畫出可疑點
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;//將掃描動畫重置并刷新數(shù)據(jù),后面要將數(shù)據(jù)刷新的函數(shù)寫在下面。
}效果圖,雷達(dá)右上角的圖標(biāo)對應(yīng)著on_pushButton的點擊事件

到此這篇關(guān)于利用Qt繪制雷達(dá)掃描效果的文章就介紹到這了,更多相關(guān)Qt雷達(dá)掃描內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于C語言實現(xiàn)圖書管理信息系統(tǒng)設(shè)計
這篇文章主要為大家詳細(xì)介紹了基于C語言實現(xiàn)圖書管理信息系統(tǒng)設(shè)計與實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01

