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();
}
倒计时结束
扫描二维码关注公众号,回复:
13122172 查看本文章

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();
}