當鼠標移動到頭像控件時,顯示懸浮窗,當鼠標離開時,懸浮窗隱藏。
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 }