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