QT旋转按钮控件的实现


QT旋转按钮控件的实现
一、实现需求:鼠标hover时旋转

需求是:实现类似于WINDOWS下,某些软件窗口关闭按钮的样式,

比如下图:WINDOWS某讯电脑管家的关闭按钮,鼠标hover时的效果,鼠标松开时的效果,目前没有要求,也就没实现,但是实现的原理的一样的

在这里插入图片描述

实现后的效果如下图:
在这里插入图片描述

二、实现方式:计时器做动画

PS:这里仅仅讲述旋转的实现,对于按钮:default样式,hover样式,click样式不做介绍;如果有更好的方式,希望大佬不吝赐教。
方法:
1、使用计时器;每隔一定的时间旋转一定的角度(当前是)
2、到达一定的角度后不再旋转,还原(当前是 90°就停止还原)
3、鼠标 hover 的时候,开始计时,旋转

三、代码实现

代码不全,但是依旧能够理解大概思想。

按钮使用的 QLabel 控件

CloseButton::CloseButton(QWidget *parent): QLabel(parent)
{
    
    

    // 其它操作
	..........
	........
	default_closePix = QIcon(":/image/ukui-taskview-close-default.png").pixmap(btnSize.width(), btnSize.width());
	hover_closePix = QIcon("://image/ukui-taskview-close-hover.png").pixmap(btnSize.width(), btnSize.width());
    click_closePix = QIcon(":/image/ukui-taskview-close-click.png").pixmap(btnSize.width(), btnSize.width());

    m_pCircleTimer = new QTimer(this);
    m_pCircleTimer->setInterval(50);
    connect(m_pCircleTimer, &QTimer::timeout, this, &CloseButton::onTimeout);
}
void CloseButton::btnStateEnter()
{
    
    
    startCircle();
    setPixmap(hover_closePix);
    raise();
    return;
}

重点在于 m_nAngle 这个角度值的改变

void CloseButton::paintEvent(QPaintEvent *event)
{
    
    
    if (BTN_STATE_ENTER == m_btnState)
    {
    
    

        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing); // 反锯齿;
        painter.setPen(Qt::transparent);
        QRect rect = this->rect();
        rect.setWidth(rect.width());
        rect.setHeight(rect.height());

        painter.translate(btnSize.width() / 2, btnSize.height() / 2); // 设置旋转中心
        painter.rotate(m_nAngle); // 旋转
        painter.translate(-(btnSize.width() / 2), -(btnSize.height() / 2)); // 将原点复位

        painter.drawPixmap(rect, hover_closePix);
    } else {
    
    
        QLabel::paintEvent(event);
    }
}

void CloseButton::startCircle()
{
    
    
    m_pCircleTimer->start();
}

倒计时结束

void CloseButton::onTimeout()
{
    
    
    ++m_nCirleCount;
    if(m_nAngle == 90) // 旋转 90度
    {
    
    
        m_nAngle = 0;
    }
    m_nAngle += 15 ;

    if(m_nCirleCount == 6)
    {
    
    
        m_pCircleTimer->stop();
        m_nCirleCount = 0;
    }
    update();
}

猜你喜欢

转载自blog.csdn.net/qq_43473694/article/details/110919316
今日推荐