QT仿QQ页面

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

效果

 

原文地址:https://www.cnblogs.com/liuxianglei/p/9968206.html