博主开发编译器为QT5.12.2,效果图如下图。
![在这里插入图片描述](https://img-blog.csdnimg.cn/9235602db4bb47c787d8d46b57464435.png)
获得初版扫描图后,感觉效果实在是太拿不出手了(如下图)。
后经一点点修改,包含背景修改,添加直线添加刻度等等,得到了文章最初的效果,显然没有OpenGL所画的效果好,但多少也可以给项目用了。
下面我就分部分享一下修改的地方,函数具体用法网上已经很全了,不过多的去讲解了。
首先是换背景,简单选个背景颜色,如更换只需要更改下面三元素即可。
this->setStyleSheet("QWidget{background-color:rgb(25,25,112)}");
其次用drawEllipse()和drawLine()两个函数用来画直线和圆。
int i=0;
while ((50+(400/8.00*i))*2<width()&&(50+(400/8.00*i))*2<height()) {
painter.drawEllipse(50+(width()/8.00*i), 50+(height()/8.00*i), width() - (50+(width()/8.00*i))*2, height() - (50+(height()/8.00*i))*2);
i++;
}
for (int i=0;i<12;i++) {
painter.drawLine(width() / 2, height() / 2,
width() / 2 + (width() - 20) / 2 * qCos(qDegreesToRadians(30.00*i)),
height() / 2 + (height() - 20) / 2 * qSin(qDegreesToRadians(30.00*i)));
}
上面弄完差不多有点样子了,下面通过rotate函数进行对坐标的旋转,用translate函数对坐标进行移动,然后画线,到达画出刻度尺的效果(不过这块还有一些小问题就是,这个方法只能画圆,当界面宽和长不相等的时候,无法画椭圆,如果有更好方法的大佬,希望能评论区指点一下,非常感谢。);
painter.translate(width() / 2,height() / 2);
painter.setFont(QFont("Calibri",10));
for(int i=1;i<=360;i++){
painter.rotate(1);
painter.drawLine(0,-width() / 2+10,0,-width() / 2+13);
}
for(int i=1;i<=72;i++){
painter.rotate(5);
painter.drawLine(0,-width() / 2+10,0,-width() / 2+15);
}
for(int i=1;i<=36;i++){
painter.setRenderHint(QPainter::Antialiasing);
painter.rotate(10);
painter.drawLine(0,-width() / 2+10,0,-width() / 2+20);
}
之后就是对扫描线的处理了,一根线实在是太丑了o(╥﹏╥)o。
利用QConicalGradient类,做一个渐变,然后用drawPie函数去画一个扇形,不会用QConicalGradient类的朋友可以不用渐变,直接画扇形就行,这个扇形跟着角度变化而变化,不要问我为啥乘16,我也不太清楚,就当是弧度传角度了。
QConicalGradient gradient(width() / 2, height() / 2,angle);
gradient.setColorAt(0.875, QColor(0, 255, 0, 0));
gradient.setColorAt(1, QColor(0, 255, 0, 155));//尾部
painter.setBrush(gradient);
painter.setPen(QPen(Qt::NoPen));//去掉外框线
painter.drawPie(10,10, width()-20, height()-20,angle*16,-45.00*16);
以上就是一个完整的动态扫描图就出来了,当然扫描图哪能没有目标呢?
利用以下代码,就是画了几个圆,然后透明度和大小定时变化,就形成了一个动态的小点点。让人看起来就是在闪。
painter.setBrush(QBrush(QColor(50, 255, 200,alpha)));
//painter.drawEllipse(0,0,15,15);
painter.drawEllipse(200,200,cir_size,cir_size);
painter.drawEllipse(100,100,cir_size,cir_size);
总的来说,因为是陪人学习加感兴趣,从决定做到找资源学习并做出来用了1天多的时间(算很慢的了),效果还算可以,能达到自己的最低要求,后续还会尝试优化,有兴趣的朋友或愿意指导一下本菜鸟的大佬,欢迎留言讨论或指点,嘿嘿。