最近心血来潮想做一个仿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()); } } }
效果