pos機菜單鎖,Qt之懸浮球菜單

 新聞資訊2  |   2023-06-24 11:13  |  投稿人:pos機之家

網(wǎng)上有很多關(guān)于pos機菜單鎖,Qt之懸浮球菜單的知識,也有很多人為大家解答關(guān)于pos機菜單鎖的問(wèn)題,今天pos機之家(www.xjcwpx.cn)為大家整理了關(guān)于這方面的知識,讓我們一起來(lái)看下吧!

本文目錄一覽:

1、pos機菜單鎖

pos機菜單鎖

一、概述

最近想做一個(gè)炫酷的懸浮式菜單,考慮到菜單展開(kāi)和美觀(guān),所以考慮學(xué)習下Qt的動(dòng)畫(huà)系統和狀態(tài)機內容,打開(kāi)QtCreator的示例教程瀏覽了下,大致發(fā)現教程中2D Painting程序和Animated Tiles程序有所幫助,如下圖所示,這兩個(gè)demo講述了怎么做一個(gè)展開(kāi)動(dòng)畫(huà),感興趣的同學(xué)也可以直接參考

有了這兩個(gè)demo之后,就可以開(kāi)始動(dòng)工寫(xiě)咱們自己的程序。

二、效果展示

如下兩幅圖就是作者失效的兩個(gè)懸浮菜單效果圖,展示圖1代碼已上傳至CSDN,不需要積分即可下載,效果圖2代碼暫時(shí)不開(kāi)源,有需要的朋友可以進(jìn)一步咨詢(xún)

基礎圓形菜單功能,代碼已上傳CSDN - Qt 失效的 PC 端環(huán)形菜單、懸浮球菜單、展開(kāi)動(dòng)畫(huà)

高級懸浮球菜單、支持二級菜單打開(kāi)

三、實(shí)現代碼

實(shí)現文件比較簡(jiǎn)單,只有頭文件和實(shí)現文件,這里先主要放出頭文件,然后講解實(shí)現思路,具體實(shí)現細節可以通過(guò)下載源碼進(jìn)行具體了解

1、菜單項

PopRingItem為菜單展開(kāi)項、可以通過(guò)綁定外部QAction實(shí)現與普通菜單相同功能

class PopRingItem : public QLabel{Q_OBJECTpublic:PopRingItem(QWidget *parent = 0);~PopRingItem();void SetRadius(int radius);int GetRadius() const;void BindAction(QAction * action);signals:void MouseEvent(bool);protected:virtual void enterEvent(QEvent * event) override;virtual void leaveEvent(QEvent * event) override;virtual void paintEvent(QPaintEvent * event) override;protected:int m_iRadius = 50;QAction * m_actAction = nullptr;};2、懸浮球

懸浮球為菜單入口,繼承自菜單項,與菜單項有相似功能

class QVariantAnimation;class QPropertyAnimation;class PopRingMenu : public PopRingItem{Q_OBJECTpublic:PopRingMenu(QWidget *parent = 0);~PopRingMenu();signals:void DoubleClicked();public:void SetActions(const QVector<QAction *> & acts);void SetIcons(const QVector<QString> & icons);void SetAnimationEnabled(bool enabled);bool IsAnimationEnabled() const;void SetSlowlyFade(bool enabled);bool IsSlowlyFade() const;void SetDistanced(int distance);int GetDistanced() const;void SetStartAngle(int angle);int GetStartAngle() const;void SetStepAngle(int angle);int GetStepAngle() const;void SetNormalMenuSize(int size);int GetNormalMenuSize() const;void SetNormalItemSize(int size);int GetNormalItemSize() const;protected:virtual void enterEvent(QEvent * event) override;virtual void leaveEvent(QEvent * event) override;virtual void mouseDoubleClickEvent(QMouseEvent * event) override;virtual void timerEvent(QTimerEvent * event) override;virtual bool event(QEvent * event) override;private slots:void OnMouseEvent(bool);private:void UpdateActions(int msecond);void ExpandMenu();void CollapseMenu();void SlowlyFade();void QuicklyLighter();bool IsUnderMouse() const;void TryCollapseMenu();void KillHideTimer();private:int m_iDistance = 70;int m_iStartAngle = 0;int m_iStepAngle = 60;int m_iMenuSize = 70;int m_iItemSize = 60;int m_iTimerID = -1;QPropertyAnimation * m_pOpacityAnimation = nullptr;QVariantAnimation * m_pItemAnimation = nullptr;QVector<PopRingItem *> m_items;};3、關(guān)鍵點(diǎn)

初始化動(dòng)畫(huà)對象,指定動(dòng)畫(huà)時(shí)長(cháng)和動(dòng)畫(huà)起始、終止值

動(dòng)畫(huà)具體實(shí)現函數未UpdateAction,根據當前動(dòng)畫(huà)進(jìn)度值在動(dòng)畫(huà)起始值和終止值所占比例,進(jìn)行計算當前動(dòng)畫(huà)時(shí)刻菜單項的位置和大小

m_pItemAnimation = new QVariantAnimation(this);m_pItemAnimation->setEasingCurve(QEasingCurve::InCubic);m_pItemAnimation->setStartValue(ShowMenuStartValue);m_pItemAnimation->setEndValue(ShowMenuEndValue);m_pItemAnimation->setDuration(ShowMenuDuration);connect(m_pItemAnimation, &QVariantAnimation::valueChanged, this, [this](const QVariant & v){UpdateActions(v.toInt());});

鼠標進(jìn)入懸浮球時(shí),執行展開(kāi)動(dòng)畫(huà)

void PopRingMenu::ExpandMenu(){if (m_pItemAnimation){if (m_pItemAnimation->state() != QAbstractAnimation::Running&& m_pItemAnimation->currentValue().toInt() != ShowMenuEndValue){m_pItemAnimation->setDirection(QVariantAnimation::Forward);m_pItemAnimation->start();}}else{UpdateActions(ShowMenuEndValue);}KillHideTimer();QuicklyLighter();}

鼠標離開(kāi)懸浮球時(shí),執行收起動(dòng)畫(huà),與展開(kāi)動(dòng)畫(huà)相反方向收起動(dòng)畫(huà)時(shí)有一個(gè)細節點(diǎn),那就是鼠標hover在菜單項上時(shí),也不能收起

void PopRingMenu::CollapseMenu(){if (false == IsUnderMouse()){if (m_pItemAnimation){m_pItemAnimation->setDirection(QVariantAnimation::Backward);m_pItemAnimation->start();}else{UpdateActions(ShowMenuStartValue);}KillHideTimer();SlowlyFade();}}

展開(kāi)和收起動(dòng)畫(huà)實(shí)現細節,根據動(dòng)畫(huà)指定幀數,按比例進(jìn)行縮放和移動(dòng)菜單項

void PopRingMenu::UpdateActions(int msecond){int curDistance = msecond * m_iDistance / ShowMenuEndValue;for (int i = 0; i < m_items.size(); ++i){PopRingItem * item = m_items.at(i);double radians = qDegreesToRadians(m_iStepAngle * i * 1.0 + m_iStartAngle);int offx = curDistance * qCos(radians);int offy = curDistance * qSin(radians);item->move(pos() + QPoint(offx, offy));int curSize = msecond * m_iItemSize / ShowMenuEndValue;item->SetRadius(curSize);item->setVisible(ShowMenuStartValue != msecond);};::SetWindowPos(HWND(winId()), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);}

懸浮球指定時(shí)間未激活時(shí),淡出,減少對用戶(hù)視覺(jué)沖擊

void PopRingMenu::SetSlowlyFade(bool enabled){if (enabled){if (nullptr == m_pOpacityAnimation){m_pOpacityAnimation = new QPropertyAnimation(this, "opacity");m_pOpacityAnimation->setEasingCurve(QEasingCurve::OutCubic);m_pOpacityAnimation->setStartValue(SlowlyStartValue);m_pOpacityAnimation->setEndValue(SlowLyEndValue);m_pOpacityAnimation->setDuration(SlowlyFadeDuration);}}else{if (m_pOpacityAnimation){delete m_pOpacityAnimation;m_pOpacityAnimation = nullptr;}}}

以上就是關(guān)于pos機菜單鎖,Qt之懸浮球菜單的知識,后面我們會(huì )繼續為大家整理關(guān)于pos機菜單鎖的知識,希望能夠幫助到大家!

轉發(fā)請帶上網(wǎng)址:http://www.xjcwpx.cn/newsone/72630.html

你可能會(huì )喜歡:

版權聲明:本文內容由互聯(lián)網(wǎng)用戶(hù)自發(fā)貢獻,該文觀(guān)點(diǎn)僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權,不承擔相關(guān)法律責任。如發(fā)現本站有涉嫌抄襲侵權/違法違規的內容, 請發(fā)送郵件至 babsan@163.com 舉報,一經(jīng)查實(shí),本站將立刻刪除。