1. 程式人生 > >Qt實現無邊框窗體的移動

Qt實現無邊框窗體的移動

本文內容,基本參考自網際網路,所以定義為轉載。

我們知道360安全衛士的介面是沒有外邊框的,去除外邊框

setWindowFlags(Qt::FramelessWindowHint);

 但是去除邊框之後,無法移動整個窗體,為了實現這個移動效果,需要重新實現三個函式

    void mousePressEvent(QMouseEvent * e);
    void mouseReleaseEvent(QMouseEvent * e);
    void mouseMoveEvent(QMouseEvent * e);

對應的實現如下

void FramelessMoveWindow::mousePressEvent(QMouseEvent *e)
{
    if (e->button() == Qt::LeftButton) {
        mMousePoint = e->globalPos() - this->pos();
        e->accept();
        mDragWindow = true;
    }
}

void FramelessMoveWindow::mouseReleaseEvent(QMouseEvent */*e*/)
{
    mDragWindow = false;
}

void FramelessMoveWindow::mouseMoveEvent(QMouseEvent *e)
{
    if (mDragWindow && (e->buttons() && Qt::LeftButton)) {
        this->move(e->globalPos() - mMousePoint);
        e->accept();
    }
}
有人可能覺得只實現下面兩個函式也是可以的
    void mousePressEvent(QMouseEvent * e);
    void mouseMoveEvent(QMouseEvent * e);

但是當你窗體上有別的控制元件接收了press事件的話,會出現窗體閃爍的情況

在建構函式裡新增程式碼

    QPushButton *button = new QPushButton(this);
    button->setText("Button");

當你點選這個button的話,會發現只實現press函式和move函式,是有問題的。

關於左鍵單擊的判斷和左鍵移動的判斷的條件處理

//左鍵單擊 
if (e->button() == Qt::LeftButton) {
       
    }
//左鍵移動
if (e->buttons() && Qt::LeftButton) {

    }
為什麼兩次判斷左鍵的方式不一樣呢?

因為在

void mouseMoveEvent(QMouseEvent *e)

裡面e->button()返回的一直是QT::NoButton