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());
        }
    }
}

效果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM