QT旋转按钮控件的实现
生活随笔
收集整理的這篇文章主要介紹了
QT旋转按钮控件的实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 一、實現需求:鼠標hover時旋轉
- 二、實現方式:計時器做動畫
- 三、代碼實現
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(); } 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的QT旋转按钮控件的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu20.0.4更新至中文环境
- 下一篇: QT:触摸屏支持手指触摸,增加touch