范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Qt之悬浮球菜单

  一、概述
  最近想做一个炫酷的悬浮式菜单,考虑到菜单展开和美观,所以考虑学习下Qt的动画系统和状态机内容,打开QtCreator的示例教程浏览了下,大致发现教程中 2D Painting  程序和Animated Tiles  程序有所帮助,如下图所示,这两个demo讲述了怎么做一个展开动画,感兴趣的同学也可以直接参考
  有了这两个demo之后,就可以开始动工写咱们自己的程序。 二、效果展示
  如下两幅图就是作者失效的两个悬浮菜单效果图,展示图1代码已上传至CSDN,不需要积分即可下载,效果图2代码暂时不开源,有需要的朋友可以进一步咨询
  基础圆形菜单功能,代码已上传CSDN - Qt 失效的 PC 端环形菜单、悬浮球菜单、展开动画
  高级悬浮球菜单、支持二级菜单打开
  三、实现代码
  实现文件比较简单,只有头文件和实现文件,这里先主要放出头文件,然后讲解实现思路,具体实现细节可以通过下载源码进行具体了解 1、菜单项
  PopRingItem为菜单展开项、可以通过绑定外部QAction实现与普通菜单相同功能 class PopRingItem : public QLabel { 	Q_OBJECT  public: 	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_OBJECT  public: 	PopRingMenu(QWidget *parent = 0); 	~PopRingMenu();  signals: 	void DoubleClicked();  public: 	void SetActions(const QVector & acts); 	void SetIcons(const QVector & 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 m_items; }; 3、关键点初始化动画对象,指定动画时长和动画起始、终止值
  动画具体实现函数未UpdateAction,根据当前动画进度值在动画起始值和终止值所占比例,进行计算当前动画时刻菜单项的位置和大小 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()); });
  鼠标进入悬浮球时,执行展开动画 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(); }
  鼠标离开悬浮球时,执行收起动画,与展开动画相反方向 收起动画时有一个细节点,那就是鼠标hover在菜单项上时,也不能收起 void PopRingMenu::CollapseMenu() { 	if (false == IsUnderMouse()) 	{ 		if (m_pItemAnimation) 		{ 			m_pItemAnimation->setDirection(QVariantAnimation::Backward); 			m_pItemAnimation->start(); 		} 		else 		{ 			UpdateActions(ShowMenuStartValue); 		}  		KillHideTimer(); 		SlowlyFade(); 	} }
  展开和收起动画实现细节,根据动画指定帧数,按比例进行缩放和移动菜单项 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); }
  悬浮球指定时间未激活时,淡出,减少对用户视觉冲击 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; 		} 	} } 四、相关文章qt 之菜单项定制 Qt  之 QAbstractItemView 右键菜单 Qt 弹出式 菜单 阴影 Qt 之自定义 QLineEdit 右键 菜单 Qt 之股票组件 - 自选股 -- 列表可以拖拽、右键常用 菜单

早安,小年今天是2023年1月15日,是中国南方的小年,也是我的小年。人年过50后,瞌睡特别少,哪怕是晚上11点钟睡,凌晨四点左右都会自然醒。今天我醒来的特别早,看了下时间才凌晨3点11分。无数的选择操之在我人生拥有的是不断的抉择,看您是用什么态度,去看待这些有赖您决定的无数机会。能够纵观每件事情每个问题的正反两面,您将发现,内心最深沉的恐惧,也在所有状况明朗了解之后,将会自行化为乌有你的少年就要离去我的生活也是头条(题记无数次从远处凝望母校,从不敢走进。四十岁的男人,本不该有睹物思往的资格。生活,已被过成了沧桑,岁月,已然被蹉跎。白发,那只不过是苍老的年华。20年后的今天,站姥姥,您离开我十年了,我的生活虽然有些不幸但我也在努力(1)姥姥,您走的时候,老舅说您走之前和他说,我们姐妹三个您最放不下我,因为当时我还没有对象,我看似温和幽默,实则是最不甘平庸过日子的,有些爱幻想,您疼我,确也知道我的缺点,您从小就不忍富养自己,要从养气开始01hr我们常常说有钱富养生活,没钱富养精神。关于富养的话题,层出不穷。可是,具体如何做,却需要深层次地思考,因人而异。古人说气聚则形成,气散则形亡。孟子说我善养吾浩然之气。可见一39岁的单身姐姐,连回家过年的车票都买不起,妹妹我给你买有钱没钱回家过年前言从前说的是有钱没钱,回家过年。一年一度的春运大潮,买一张车票都很难。现在呢?以后再也不会有什么春运一说了,没了民工潮,曾经的打工仔已经老去,已经回到了本来应该属散文一年将尽时,才觉岁月深杨绛先生回首百岁人生,彻悟了生活我们穷尽一生追求的幸福,不在过去,不在未来,而在当下,眼中景碗中餐身边人。人生,总有太多来不及,一眨眼就是一日,一回头就是一年,一转身就是一辈子。三夜读为什么要回家过年?一句我回来了,就是最好的年第064期春节将至,许多人会不远千里,从一座城奔赴另外一座城,只为赶上除夕夜的那顿团圆饭。在中国人心中,春节有着千斤般的分量。很多人为了工作,背井离乡,漂时尚发布上下颠倒,内外翻转视频加载中上下颠倒,内外翻转就像FENDI双F标志一样SilviaVenturiniFendi的男装造型语言幻化为一场充满对比与并列元素的无尽游戏。重点在于把握装饰度与简约性之间的印尼羽毛球大师赛乔纳坦男单夺冠1月29日,乔纳坦在颁奖仪式上。新华社记者徐钦摄当日,在雅加达举行的2023年印尼羽毛球大师赛男单决赛中,印度尼西亚选手乔纳坦以2比0战胜队友瓦多约,夺得冠军。1月29日,乔纳坦在佟丽娅穿白色涂鸦针织毛衣,时尚治愈娱评大赏佟丽娅穿一袭白色涂鸦针织毛衫,清新可人,时尚在暖阳下,全身散发光,暖和,真的好治愈!最近,佟丽娅下班后拍摄了一组春季暖阳下的照片,佟丽娅穿着一件涂鸦宽松毛衣,长发垂下,手里
年轻人创业,是借钱做大点的,还是从小的开始做慢慢来?这个问题,年轻人首次创业,是凭个人创业能力赚钱和创业经验赚钱,而不是自己一时心血来潮,想干什么就干什么。如果你自己没有创业经验而盲目投资,最后创业失败而投资亏损机率比较大。本人认为曝詹姆斯招募乐福,加盟湖人需放弃3126万美元,骑士会送温暖吗?如果乐福真的可以加盟湖人需要满足两个条件一个是骑士愿意放,一个是湖人愿意要,而乐福要走也需要满足两种方式其中一种一个是球员交换离开,一种是和骑士协商买断,很显然球员交易湖人是没人可为什么那么多人嘴上说着支持国产,却用着苹果手机?我用的是华为感谢您的阅读!为什么很多人嘴上说着支持国产手机,但使用的却是苹果手机?实际上,我们在日常使用手机的过程中,会发现国产手机有了自己的特色,也有了自己的不足。但同时你会发现红米手机哪个型号最好?Redmi红米数字系列Redmi83GB32GB699元4GB64GB799元Redmi8A3GB32GB599元4GB64GB699元Redmi7A2GB32GB539元3GB3你买过的什么东西一直在用,而且用了非常久呢?这块上海表,是岳母全家人攒钱给我买的,当时的价格120元人民币,工业卷15个。50多年过了,它始终陪伴着我,珍惜它来之不易,为了买这块表,岳母家所付出的心血太多了。到如今走的非常准一个人在家,不知道吃啥,有什么建议?导语一个人在家,不知道吃啥,有什么建议?大家好,我是宝妈私房七七八八,很高兴回答这个问题。一个人的饭确实不太好做,做多了怕浪费,做少点吧,感觉还要折腾做丰盛一点吧没有人吃也没劲做简手机能开两个微信吗?手机中如何同时开两个微信号,针对于很多有2个微信的朋友来说,这个方法你高兴。记得投票,收藏和点赞哦!方法步骤手机中如何同时开两个微信号,就需要先现在2个软件,一个是微信软件,一个是谁能帮我分析下购买三星大屏手机,选S20u还是N20u好?note20ultra好,自己正在用中这个时候问,最明显的答案是s22u或者zfold3,因为这个时间很尴尬,新机马上发布,价格会贵一点,如果价格要又会,那就是刚发布的上一代折叠屏听说晚上不吃任何东西,一个月下来能瘦10斤,不知道行不行?我从160斤减到125斤,就是靠着晚上不吃任何东西减下来的,第一个月减了18斤!没减肥之前有一次睡着觉时,摸着自己后背的肉肉吓了一跳,一下惊醒了!从此决心一定要减下来,并且给自己一为了省钱,你可以省到什么程度?1,删除淘宝,拼多多,尽量不网购。2,早餐吃两个水煮蛋,不到外面吃早饭。中午在单位吃工作餐不要钱,吃饱点,晚上吃一个苹果或者西红柿。3,不买新衣服,就简单的几件衣服换来换去。其实这助听器能一直用吗?谢谢邀请,佩戴和使用助听器是个长期的过程,我们需要借助它接受更多的声音刺激,让大脑接受更多的声音信息,以维持大脑对言语的分辨和分析能力,它会帮助您延缓听功能的继续退化,建议日常生活