最近心血來潮想做一個仿QQ的頁面。
頁面的顏色和圖標配置主要通過QSS實現,模仿的功能有:
靠近屏幕上邊緣自動隱藏和彈出功能。
無邊框設計和最小化
用到的函數有:
void leaveEvent(QEvent *); //檢測鼠標離開窗口
void enterEvent(QEvent *);//檢測鼠標進入窗口
思路:
鼠標離開的時候,檢測窗口上邊緣Y坐標,小於1(相當於等於0)的時候,將窗口移出到屏幕外,在屏幕內保留1一個像素的高度;
鼠標停靠的時候,檢測窗口下邊緣Y坐標,小於2(相當於等於1)的時候,說明處於隱藏狀態,窗口根據設定速度移入屏幕內;
主要代碼如下:
初始化部分
MainWindow::MainWindow(QWidget *parent, Qt::WFlags flags) : QMainWindow(parent, flags) { ui.setupUi(this); this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinimizeButtonHint | Qt::WindowStaysOnTopHint); QMovie *movie = new QMovie(":/MainWindow/image/log.gif"); ui.label_5->setMovie(movie); movie->start(); }
檢測鼠標位置:
void MainWindow::mousePressEvent(QMouseEvent * event) { this->setFocus(); m_lastpos = frameGeometry().topLeft() - event->globalPos(); }
檢測鼠標移動:
void MainWindow::mouseMoveEvent(QMouseEvent * event) { if (this->hasFocus() == false) { return; } if (event->buttons() == Qt::LeftButton) { QPointF currentpos = event->globalPos(); QPointF aa = currentpos + m_lastpos;//左上角新坐標 = 左上角舊坐標 + 鼠標新坐標 - 鼠標舊坐標 if (aa.y() > 0)//禁止移出屏幕 move(aa.toPoint()); else move(aa.x(),0); } }
檢測鼠標離開
void MainWindow::leaveEvent(QEvent * event) { if (this->pos().y() < 1) { setGeometry(pos().x(), -this->height() + 1 , this->width(), this->height()); } }
檢測鼠標移入
void MainWindow::enterEvent(QEvent * event) { int n = 300; if(this->pos().y() + this->height() < 2 ) { for(int i = 0; i < n; ++i)//控制移動速度 { int y = -this->height() + (float)this->height()/n * (i+1); setGeometry(pos().x(),y , this->width(), this->height()); } } }
效果