Qt之显示雷达效果自定义:
1、QPainter:
自定义显示雷达的基础是Qt自带的绘图画笔QPainter,通过重写paintEvent函数,在重写的paintEvent函数里使用画笔QPainter就能够实现在qt内自定义绘图。
2、QConicalGradient:
其次在Qt内进行雷达自定义显示需要用到QConicalGradient类,运用QConicalGradient类能够达到圆形渐变颜色的效果,即能够达到雷达显示的效果。
void Scan::radarShow(QPainter *painter)
{
/** 绘制雷达图 **/
/** 绘制扫描效果 **/
QConicalGradient gradient(center.x(), center.y(), s_angle + 360);
gradient.setColorAt(0.1, lineColor);
gradient.setColorAt(0.6, QColor(0, 255, 0, 0));
painter->setBrush(gradient);
painter->setPen(QPen(Qt::NoPen));//去掉外框线
//center--雷达中心点;radius--雷达探测半径; s_angle--雷达探测起始角度
painter->drawPie(center.x() - radius/2, center.y() - radius/2, radius, radius, s_angle * 16, 360 * 16);
s_angle -= span;//span--每次旋转的角度大小
}
3、动态扫描:
通过上诉方法能够实现雷达扫描的一个显示效果,但是想要让雷达在圆形内动起来还需要借用QTimer类,通过QTimer类实现一个自动刷新的定时器,定时器触发雷达实时扫描的效果。
Scan::Scan(QWidget *parent) :
QWidget(parent)
{
this->resize(parent->size());
this->setAttribute(Qt::WA_TranslucentBackground);//强制设置背景颜色为透明
setWindowFlags(Qt::FramelessWindowHint | windowFlags());//强制设置窗口无边框
timer = new QTimer();
connect(timer,SIGNAL(timeout()),this,SLOT(timerTimeOut()));//用槽函数控制雷达扫描效果。
}
void Scan::timerTimeOut()
{
timer->start(10);
if(s_angle<-360){
s_angle=0;
}//防止s_angle的值不会溢出
update();
}
4、封装类:
将重写的paintEvent方法和QTimer类封装在同一个类里面,最后通过实例化对象,实时调用对象中的方法就能够实现雷达的自定义显示啦!
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
scan = new Scan(this);
}
void MainWindow::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
scan->radarShow(&painter);
}
5、效果展示