網(wǎng)上有很多關(guān)于pos機(jī)菜單鎖,Qt之懸浮球菜單的知識(shí),也有很多人為大家解答關(guān)于pos機(jī)菜單鎖的問題,今天pos機(jī)之家(m.afbey.com)為大家整理了關(guān)于這方面的知識(shí),讓我們一起來看下吧!
本文目錄一覽:
pos機(jī)菜單鎖
一、概述最近想做一個(gè)炫酷的懸浮式菜單,考慮到菜單展開和美觀,所以考慮學(xué)習(xí)下Qt的動(dòng)畫系統(tǒng)和狀態(tài)機(jī)內(nèi)容,打開QtCreator的示例教程瀏覽了下,大致發(fā)現(xiàn)教程中2D Painting程序和Animated Tiles程序有所幫助,如下圖所示,這兩個(gè)demo講述了怎么做一個(gè)展開動(dòng)畫,感興趣的同學(xué)也可以直接參考
有了這兩個(gè)demo之后,就可以開始動(dòng)工寫咱們自己的程序。
二、效果展示如下兩幅圖就是作者失效的兩個(gè)懸浮菜單效果圖,展示圖1代碼已上傳至CSDN,不需要積分即可下載,效果圖2代碼暫時(shí)不開源,有需要的朋友可以進(jìn)一步咨詢
基礎(chǔ)圓形菜單功能,代碼已上傳CSDN - Qt 失效的 PC 端環(huán)形菜單、懸浮球菜單、展開動(dòng)畫
高級(jí)懸浮球菜單、支持二級(jí)菜單打開
三、實(shí)現(xiàn)代碼實(shí)現(xiàn)文件比較簡單,只有頭文件和實(shí)現(xiàn)文件,這里先主要放出頭文件,然后講解實(shí)現(xiàn)思路,具體實(shí)現(xiàn)細(xì)節(jié)可以通過下載源碼進(jìn)行具體了解
1、菜單項(xiàng)PopRingItem為菜單展開項(xiàng)、可以通過綁定外部QAction實(shí)現(xiàn)與普通菜單相同功能
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、懸浮球
懸浮球?yàn)椴藛稳肟?,繼承自菜單項(xiàng),與菜單項(xiàng)有相似功能
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)畫對(duì)象,指定動(dòng)畫時(shí)長和動(dòng)畫起始、終止值
動(dòng)畫具體實(shí)現(xiàn)函數(shù)未UpdateAction,根據(jù)當(dāng)前動(dòng)畫進(jìn)度值在動(dòng)畫起始值和終止值所占比例,進(jìn)行計(jì)算當(dāng)前動(dòng)畫時(shí)刻菜單項(xiàng)的位置和大小
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());});
鼠標(biāo)進(jìn)入懸浮球時(shí),執(zhí)行展開動(dòng)畫
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();}
鼠標(biāo)離開懸浮球時(shí),執(zhí)行收起動(dòng)畫,與展開動(dòng)畫相反方向收起動(dòng)畫時(shí)有一個(gè)細(xì)節(jié)點(diǎn),那就是鼠標(biāo)hover在菜單項(xiàng)上時(shí),也不能收起
void PopRingMenu::CollapseMenu(){if (false == IsUnderMouse()){if (m_pItemAnimation){m_pItemAnimation->setDirection(QVariantAnimation::Backward);m_pItemAnimation->start();}else{UpdateActions(ShowMenuStartValue);}KillHideTimer();SlowlyFade();}}
展開和收起動(dòng)畫實(shí)現(xiàn)細(xì)節(jié),根據(jù)動(dòng)畫指定幀數(shù),按比例進(jìn)行縮放和移動(dòng)菜單項(xià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í),淡出,減少對(duì)用戶視覺沖擊
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機(jī)菜單鎖,Qt之懸浮球菜單的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于pos機(jī)菜單鎖的知識(shí),希望能夠幫助到大家!