Qt模仿微信扫一扫

本文详细介绍如何使用Qt的QLabel和定时器实现扫描动画效果,包括创建QLabel,设置几何位置,绘制背景图像,使用QPainter进行抗锯齿椭圆绘制,并通过QPixmap显示图像。同时,文章还介绍了如何在界面中利用QPaintEvent绘制辅助线条和阴影,以增强视觉效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现扫描的动画是一个label加定时器

label = new QLabel(this);
    label->setGeometry((width() - VIEWFINDER_WIDTH)/2,(height() + VIEWFINDER_HEIGHT)/2,VIEWFINDER_WIDTH,GRADUAL_WIDTH);


    QImage mainimg=QImage(2*VIEWFINDER_WIDTH,GRADUAL_WIDTH,QImage::Format_ARGB32);
    QPainter painter(&mainimg);


    painter.setRenderHint(QPainter::Antialiasing, true);
//    QRadialGradient radialGradient(mainimg.width()/2,mainimg.height()/2,100,mainimg.width()/2,mainimg.height()/2);
//    radialGradient.setColorAt(0,QColor(105,  164,  53,TRANSPARENCY));
//    radialGradient.setColorAt(1,QColor(200,  228,  173,TRANSPARENCY));
//    painter.setBrush(radialGradient);
    painter.setPen(QPen(QColor(105,  164,  53),  1));
    painter.setBrush(QBrush(QColor(105,  164,  53)));
    painter.drawEllipse(0,0,label->width(),5);
    QPixmap pix = QPixmap::fromImage(mainimg);
    label->setPixmap(pix);

整个界面是QPaintEvent绘制

Q_UNUSED(event);
    QPainter painter(this);

    painter.setPen(QPen(QColor(127,  194,  65),  6));
    //左上
    painter.drawLine(QPointF((width() - VIEWFINDER_WIDTH)/2,(height() - VIEWFINDER_HEIGHT)/2),
                     QPointF((width() - VIEWFINDER_WIDTH)/2 + 5,(height() - VIEWFINDER_HEIGHT)/2));
    painter.drawLine(QPointF((width() - VIEWFINDER_WIDTH)/2,(height() - VIEWFINDER_HEIGHT)/2),
                     QPointF((width() - VIEWFINDER_WIDTH)/2 ,(height() - VIEWFINDER_HEIGHT)/2 + 5));

    //右上
    painter.drawLine(QPointF((width()+VIEWFINDER_WIDTH)/2,(height() - VIEWFINDER_HEIGHT)/2),
                     QPointF((width()+VIEWFINDER_WIDTH)/2 - 5,(height() - VIEWFINDER_HEIGHT)/2));
    painter.drawLine(QPointF((width()+VIEWFINDER_WIDTH)/2,(height() - VIEWFINDER_HEIGHT)/2),
                     QPointF((width()+VIEWFINDER_WIDTH)/2,(height() - VIEWFINDER_HEIGHT)/2 + 5));

    //左下
    painter.drawLine(QPointF((width() - VIEWFINDER_WIDTH)/2,(height() + VIEWFINDER_HEIGHT)/2),
                     QPointF((width() - VIEWFINDER_WIDTH)/2 + 5,(height() + VIEWFINDER_HEIGHT)/2));
    painter.drawLine(QPointF((width() - VIEWFINDER_WIDTH)/2,(height() + VIEWFINDER_HEIGHT)/2),
                     QPointF((width() - VIEWFINDER_WIDTH)/2 ,(height() + VIEWFINDER_HEIGHT)/2 - 5));

    //右下
    painter.drawLine(QPointF((width()+VIEWFINDER_WIDTH)/2,(height() + VIEWFINDER_HEIGHT)/2),
                     QPointF((width()+VIEWFINDER_WIDTH)/2 - 5,(height() + VIEWFINDER_HEIGHT)/2));
    painter.drawLine(QPointF((width()+VIEWFINDER_WIDTH)/2,(height() + VIEWFINDER_HEIGHT)/2),
                     QPointF((width()+VIEWFINDER_WIDTH)/2,(height() + VIEWFINDER_HEIGHT)/2 - 5));

    //画周边阴影
    painter.setCompositionMode( QPainter::CompositionMode_Darken );
    QColor darkenColor(0, 0, 0, 100);

    painter.fillRect( 5, 5, width(), (height() - VIEWFINDER_HEIGHT)/2 - 5, darkenColor );
    painter.fillRect( 5, (height() - VIEWFINDER_HEIGHT)/2, (width() - VIEWFINDER_WIDTH)/2 - 5,  + VIEWFINDER_HEIGHT, darkenColor );
    painter.fillRect( (width()+VIEWFINDER_WIDTH)/2, (height() - VIEWFINDER_HEIGHT)/2, (width() - VIEWFINDER_WIDTH)/2 ,  + VIEWFINDER_HEIGHT, darkenColor);
    painter.fillRect( 5, (height() + VIEWFINDER_HEIGHT)/2, width() ,  (height() + VIEWFINDER_HEIGHT)/2, darkenColor);

效果图:

完整代码:https://download.csdn.net/download/yu_20501253/10922665

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值