Qt 实现悬浮窗效果


当鼠标移动到头像控件时,显示悬浮窗,当鼠标离开时,悬浮窗隐藏。

 
1、控件选择
悬浮窗可以从QDialog派生,并将窗口的属性设置为无边框
this->setWindowFlags(this->windowFlags() | Qt::FramelessWindowHint);
这样即使创建该悬浮窗的时候,传入parent,也不会嵌入到父控件中。
 
2、计算位置
头像控件重载函数
void enterEvent(QEvent * event);
当鼠标进入时,设置该显示窗的位置,显示该悬浮窗。
 
因为pos()是相对于父控件的相对位置(位置都是左上角,因为屏幕的左上角为(0, 0))。
 
对于Dialog而言,要获取屏幕的坐标,并移动到屏幕的坐标,额,我这样写才管用。
1 QPoint oPoint = this->mapToGlobal(QPoint(0, this->height())); 2 m_pWidget->move(oPoint);

 3、实现鼠标移走隐藏效果

开始想在mousemoveEvent中处理,但是mousemoveEvent只有在鼠标进入到本控件的范围内的时候才起作用(前提是要setMouseTracking为true)。但是如果在enterEvent中和leaveEvent中处理显隐则导致鼠标进入不了悬浮窗就会隐藏。
 
想了很久,看Qt文档看到QWidget中还有timer事件,那么实现这个效果的方法就可以为:
(1)在显示悬浮窗的时候,开启timer比如一秒
this->startTimer(1000);
(2)在timerEvent中判断鼠标是否游离到了本控件和悬浮窗之外,如果游离出去了,那么隐藏窗口,并关闭timer。
 1 void GSJLoginPictureLabel::timerEvent(QTimerEvent * ev)  2 {  3     if ((m_pWidget != nullptr) && (m_pWidget->isVisible()))  4  {  5         QPoint oPoint = QCursor::pos();  6         QPoint oSelfPoint = this->mapFromGlobal(oPoint);  7         QPoint oWidgetPoint = m_pProjectWidget->mapFromGlobal(oPoint);  8         QRect oSelfRect = this->rect();  9         QRect oWidgetRect = m_pWidget->rect(); 10         if ((!oSelfRect.contains(oSelfPoint)) && (!oWidgetRect.contains(oWidgetPoint))) 11  { 12             m_pWidget->hide(); 13             killTimer(ev->timerId()); 14  } 15  } 16     else
17  { 18         killTimer(ev->timerId()); 19  } 20 }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM