Qt隱藏窗口標題欄以及無法拖動窗口

1.隱藏標題欄、工具窗口以及窗口置頂

setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint);

2.設置窗體透明度

setWindowOpacity(0.7);

3.隱藏標題欄後實現拖動

隱藏標題欄後窗體是無法拖動的,這個時候就需要重寫mousePressEvent、mouseMoveEvent和mouseReleaseEvent。

添加一個成員變量QPoint。

private:
    QPoint m_lastPos;

重寫mousePressEvent、mouseMoveEvent和mouseReleaseEvent函數。

void mousePressEvent(QMouseEvent *event)
{
    m_lastPos = event->globalPos();
}

void mouseMoveEvent(QMouseEvent *event)
{
    this->move(this->x() + (event->globalX() - m_lastPos.x()),
               this->y() + (event->globalY() - m_lastPos.y()));
    m_lastPos = event->globalPos();
}

void mouseReleaseEvent(QMouseEvent *event)
{
    // 其實這裏的mouseReleaseEvent函數可以不用重寫
    m_lastPos = event->globalPos();
}

4.解決鼠標按下其他控件後移動鼠標到QWidget區域時界面移動的問題

按照上面的寫法,會出現一個問題,就是在按住當前界面上的控件時,當按住這個動作一直存在並將鼠標從控件移動到QWidget的區域時,界面也會跟着移動,並且這樣的移動時直接跳了過去,這樣就很不完美,而且在界面很小,控件很多的情況下,拖動顯得非常卡頓,所以我們就需要在mouse事件中添加一個判斷,判斷當前鼠標按下是否是處於QWidget所在的區域。

修改很簡單,在自定義QWidget界面類中添加一個bool型變量isPressedWidget。

bool isPressedWidget;

然後在mousePressEvent、mouseMoveEvent和mouseReleaseEvent三個函數中各添上一行。

void mousePressEvent(QMouseEvent *event)
{
    m_lastPos = event->globalPos();
    isPressedWidget = true; // 當前鼠標按下的即是QWidget而非界面上佈局的其它控件
}

void mouseMoveEvent(QMouseEvent *event)
{
    if (isPressedWidget) {
        this->move(this->x() + (event->globalX() - m_lastPos.x()),
                   this->y() + (event->globalY() - m_lastPos.y()));
        m_lastPos = event->globalPos();
    }
}

void mouseReleaseEvent(QMouseEvent *event)
{
    // 其實這裏的mouseReleaseEvent函數可以不用重寫
    m_lastPos = event->globalPos();
    isPressedWidget = false; // 鼠標鬆開時,置爲false
}

5.美化自定義窗口

在爲自定義窗口類使用qss美化(解決qss對QWidget修改樣式表無效,可參考這篇文章:解決Qt使用qss時對QWidget無效)。

在對窗體設置了背景圖片,如果背景圖片是不規則矩形,則在背景圖片後,窗體會露出一部分很醜,這個時候可以將窗體的屬性設爲透明屬性。

setAttribute(Qt::WA_TranslucentBackground);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章